r553: Modern gccs require __attribute__((used)) for variables used only in assembly.
[cinelerra_cv/mob.git] / cinelerra / audio1394.C
blobe2e1b8050b66036570832df4ccb1a38526332024
1 #ifdef HAVE_FIREWIRE
7 #include "audio1394.h"
8 #include "playbackconfig.h"
9 #include "device1394input.h"
10 #include "device1394output.h"
11 #include "preferences.h"
12 #include "recordconfig.h"
13 #include "videoconfig.h"
14 #include "videodevice.h"
16 #define SAMPLES_PER_FRAME 2048
18 Audio1394::Audio1394(AudioDevice *device)
19  : AudioLowLevel(device)
21         initialize();
25 Audio1394::~Audio1394()
27         close_all();
30 int Audio1394::initialize()
32         input_thread = 0;
33         output_thread = 0;
36 int Audio1394::open_input()
38         int result = 0;
39         if(!input_thread)
40         {
41 // Lock the channels for the DV format
42                 device->in_channels = 2;
43                 device->in_bits = 16;
44                 bytes_per_sample = device->in_channels * device->in_bits / 8;
47                 input_thread = new Device1394Input;
48                 result = input_thread->open(device->in_config->firewire_port, 
49                         device->in_config->firewire_channel, 
50                         30,
51                         device->in_channels,
52                         device->in_samplerate,
53                         device->in_bits,
54                         device->vconfig->w,
55                         device->vconfig->h);
56                 if(result)
57                 {
58                         delete input_thread;
59                         input_thread = 0;
60                 }
61         }
63         return result;
66 int Audio1394::open_output()
68         if(!output_thread)
69         {
70 // Lock the channels for the DV format
71                 device->out_channels = 2;
72                 device->out_bits = 16;
73                 bytes_per_sample = device->out_channels * device->out_bits / 8;
75                 output_thread = new Device1394Output(device);
77                 if(device->driver == AUDIO_DV1394)
78                 {
79                         output_thread->open(device->out_config->dv1394_path,
80                                 device->out_config->dv1394_port,
81                                 device->out_config->dv1394_channel,
82                                 30,
83                                 device->out_channels, 
84                                 device->out_bits, 
85                                 device->out_samplerate,
86                                 device->out_config->dv1394_syt);
87                 }
88                 else
89                 {
90                         output_thread->open(device->out_config->firewire_path,
91                                 device->out_config->firewire_port,
92                                 device->out_config->firewire_channel,
93                                 30,
94                                 device->out_channels, 
95                                 device->out_bits, 
96                                 device->out_samplerate,
97                                 device->out_config->firewire_syt);
98                 }
99         }
102 int Audio1394::close_all()
104         if(input_thread)
105         {
106                 delete input_thread;
107         }
109         if(output_thread)
110         {
111                 delete output_thread;
112         }
114         initialize();
115         return 0;
119 int Audio1394::read_buffer(char *buffer, int bytes)
121         if(input_thread)
122         {
123                 input_thread->read_audio(buffer, bytes / bytes_per_sample);
124         }
126         return 0;
129 int Audio1394::write_buffer(char *buffer, int bytes)
131         if(output_thread)
132                 output_thread->write_samples(buffer, bytes / bytes_per_sample);
133         return 0;
136 int64_t Audio1394::device_position()
138         if(output_thread)
139                 return output_thread->get_audio_position();
140         else
141                 return 0;
145 int Audio1394::flush_device()
147         if(output_thread)
148                 output_thread->flush();
149         return 0;
152 int Audio1394::interrupt_playback()
154         if(output_thread)
155                 output_thread->interrupt();
156         return 0;
161 #endif