5 #include "audiodevice.h"
6 #include "audioesound.h"
11 #include "playbackconfig.h"
12 #include "preferences.h"
13 #include "recordconfig.h"
18 AudioLowLevel::AudioLowLevel(AudioDevice *device)
20 this->device = device;
23 AudioLowLevel::~AudioLowLevel()
32 AudioDevice::AudioDevice()
36 this->out_config = new AudioOutConfig(0);
37 this->in_config = new AudioInConfig;
38 this->vconfig = new VideoInConfig;
39 startup_lock = new Condition(0, "AudioDevice::startup_lock");
40 duplex_lock = new Condition(0, "AudioDevice::duplex_lock");
41 timer_lock = new Mutex("AudioDevice::timer_lock");
42 for(int i = 0; i < TOTAL_BUFFERS; i++)
44 play_lock[i] = new Sema(0, "AudioDevice::play_lock");
45 arm_lock[i] = new Sema(1, "AudioDevice::arm_lock");
47 dc_offset_thread = new DC_Offset;
50 AudioDevice::~AudioDevice()
58 for(int i = 0; i < TOTAL_BUFFERS; i++)
63 delete dc_offset_thread;
66 int AudioDevice::initialize()
68 record_before_play = 0;
71 for(int i = 0; i < TOTAL_BUFFERS; i++)
80 rec_dither = play_dither = 0;
81 software_position_info = 0;
85 last_buffer_size = total_samples = position_correction = 0;
88 lowlevel_in = lowlevel_out = lowlevel_duplex = 0;
91 total_samples_read = 0;
97 int AudioDevice::create_lowlevel(AudioLowLevel* &lowlevel, int driver)
99 this->driver = driver;
108 case AUDIO_OSS_ENVY24:
109 lowlevel = new AudioOSS(this);
115 lowlevel = new AudioESound(this);
123 lowlevel = new AudioALSA(this);
131 lowlevel = new Audio1394(this);
139 int AudioDevice::open_input(AudioInConfig *config,
140 VideoInConfig *vconfig,
146 this->in_config->copy_from(config);
147 this->vconfig->copy_from(vconfig);
148 //printf("AudioDevice::open_input %s\n", this->in_config->oss_in_device[0]);
149 in_samplerate = rate;
150 in_samples = samples;
151 create_lowlevel(lowlevel_in, config->driver);
152 lowlevel_in->open_input();
153 record_timer.update();
157 int AudioDevice::open_output(AudioOutConfig *config,
164 *this->out_config = *config;
165 out_samplerate = rate;
166 out_samples = samples;
167 out_realtime = realtime;
168 create_lowlevel(lowlevel_out, config->driver);
169 return lowlevel_out->open_output();
172 int AudioDevice::open_duplex(AudioOutConfig *out_config, int rate, int samples, int realtime)
175 duplex_init = 1; // notify playback routines to test the duplex lock
176 *this->out_config = *out_config;
177 duplex_samplerate = rate;
178 duplex_samples = samples;
180 duplex_realtime = realtime;
181 for(int i = 0; i < MAXDEVICES; i++)
183 duplex_channels += out_config->oss_out_channels[i];
185 create_lowlevel(lowlevel_duplex, out_config->driver);
186 lowlevel_duplex->open_duplex();
187 playback_timer.update();
188 record_timer.update();
193 int AudioDevice::interrupt_crash()
195 if(lowlevel_in) return lowlevel_in->interrupt_crash();
200 int AudioDevice::close_all()
202 if(lowlevel_in) lowlevel_in->close_all();
203 if(lowlevel_out) lowlevel_out->close_all();
204 if(lowlevel_duplex) lowlevel_duplex->close_all();
209 delete [] input_buffer;
214 rec_dither = play_dither = 0;
215 software_position_info = position_correction = last_buffer_size = 0;
233 delete lowlevel_duplex;
239 int AudioDevice::set_vdevice(VideoDevice *vdevice)
241 this->vdevice = vdevice;
246 int AudioDevice::get_ichannels()
248 if(r) return in_channels;
249 else if(d) return duplex_channels;
253 int AudioDevice::get_ibits()
255 if(r) return in_bits;
256 else if(d) return duplex_bits;
261 int AudioDevice::get_obits()
263 if(w) return out_bits;
264 else if(d) return duplex_bits;
268 int AudioDevice::get_ochannels()
270 if(w) return out_channels;
271 else if(d) return duplex_channels;
275 AudioLowLevel* AudioDevice::get_lowlevel_out()
277 if(w) return lowlevel_out;
278 else if(d) return lowlevel_duplex;
282 AudioLowLevel* AudioDevice::get_lowlevel_in()
284 if(r) return lowlevel_in;
285 else if(d) return lowlevel_duplex;
289 int AudioDevice::get_irate()
291 if(r) return in_samplerate;
293 if(d) return duplex_samplerate;
296 int AudioDevice::get_orealtime()
298 if(w) return out_realtime;
299 else if(d) return duplex_realtime;
304 int AudioDevice::get_orate()
306 if(w) return out_samplerate;
307 else if(d) return duplex_samplerate;
311 int AudioDevice::get_interrupted()
316 int AudioDevice::get_device_buffer()
318 return device_buffer;