3 #include "audiodevice.h"
4 #include "audioesound.h"
9 #include "playbackconfig.h"
10 #include "preferences.h"
11 #include "recordconfig.h"
16 AudioLowLevel::AudioLowLevel(AudioDevice *device)
18 this->device = device;
21 AudioLowLevel::~AudioLowLevel()
30 AudioDevice::AudioDevice()
34 this->out_config = new AudioOutConfig(0);
35 this->in_config = new AudioInConfig;
36 this->vconfig = new VideoInConfig;
37 startup_lock = new Condition(0, "AudioDevice::startup_lock");
38 duplex_lock = new Condition(0, "AudioDevice::duplex_lock");
39 timer_lock = new Mutex("AudioDevice::timer_lock");
40 for(int i = 0; i < TOTAL_BUFFERS; i++)
42 play_lock[i] = new Sema(0, "AudioDevice::play_lock");
43 arm_lock[i] = new Sema(1, "AudioDevice::arm_lock");
45 dc_offset_thread = new DC_Offset;
48 AudioDevice::~AudioDevice()
56 for(int i = 0; i < TOTAL_BUFFERS; i++)
61 delete dc_offset_thread;
64 int AudioDevice::initialize()
66 record_before_play = 0;
69 for(int i = 0; i < TOTAL_BUFFERS; i++)
78 rec_dither = play_dither = 0;
79 software_position_info = 0;
83 last_buffer_size = total_samples = position_correction = 0;
86 lowlevel_in = lowlevel_out = lowlevel_duplex = 0;
89 total_samples_read = 0;
95 int AudioDevice::create_lowlevel(AudioLowLevel* &lowlevel, int driver)
97 this->driver = driver;
106 case AUDIO_OSS_ENVY24:
107 lowlevel = new AudioOSS(this);
113 lowlevel = new AudioESound(this);
121 lowlevel = new AudioALSA(this);
129 lowlevel = new Audio1394(this);
137 int AudioDevice::open_input(AudioInConfig *config,
138 VideoInConfig *vconfig,
144 this->in_config->copy_from(config);
145 this->vconfig->copy_from(vconfig);
146 //printf("AudioDevice::open_input %s\n", this->in_config->oss_in_device[0]);
147 in_samplerate = rate;
148 in_samples = samples;
149 create_lowlevel(lowlevel_in, config->driver);
150 lowlevel_in->open_input();
151 record_timer.update();
155 int AudioDevice::open_output(AudioOutConfig *config,
162 *this->out_config = *config;
163 out_samplerate = rate;
164 out_samples = samples;
165 out_realtime = realtime;
166 create_lowlevel(lowlevel_out, config->driver);
167 lowlevel_out->open_output();
171 int AudioDevice::open_duplex(AudioOutConfig *out_config, int rate, int samples, int realtime)
174 duplex_init = 1; // notify playback routines to test the duplex lock
175 *this->out_config = *out_config;
176 duplex_samplerate = rate;
177 duplex_samples = samples;
179 duplex_realtime = realtime;
180 for(int i = 0; i < MAXDEVICES; i++)
182 duplex_channels += out_config->oss_out_channels[i];
184 create_lowlevel(lowlevel_duplex, out_config->driver);
185 lowlevel_duplex->open_duplex();
186 playback_timer.update();
187 record_timer.update();
192 int AudioDevice::interrupt_crash()
194 if(lowlevel_in) return lowlevel_in->interrupt_crash();
199 int AudioDevice::close_all()
201 if(lowlevel_in) lowlevel_in->close_all();
202 if(lowlevel_out) lowlevel_out->close_all();
203 if(lowlevel_duplex) lowlevel_duplex->close_all();
208 delete [] input_buffer;
213 rec_dither = play_dither = 0;
214 software_position_info = position_correction = last_buffer_size = 0;
232 delete lowlevel_duplex;
238 int AudioDevice::set_vdevice(VideoDevice *vdevice)
240 this->vdevice = vdevice;
245 int AudioDevice::get_ichannels()
247 if(r) return in_channels;
248 else if(d) return duplex_channels;
252 int AudioDevice::get_ibits()
254 if(r) return in_bits;
255 else if(d) return duplex_bits;
260 int AudioDevice::get_obits()
262 if(w) return out_bits;
263 else if(d) return duplex_bits;
267 int AudioDevice::get_ochannels()
269 if(w) return out_channels;
270 else if(d) return duplex_channels;
274 AudioLowLevel* AudioDevice::get_lowlevel_out()
276 if(w) return lowlevel_out;
277 else if(d) return lowlevel_duplex;
281 AudioLowLevel* AudioDevice::get_lowlevel_in()
283 if(r) return lowlevel_in;
284 else if(d) return lowlevel_duplex;
288 int AudioDevice::get_irate()
290 if(r) return in_samplerate;
292 if(d) return duplex_samplerate;
295 int AudioDevice::get_orealtime()
297 if(w) return out_realtime;
298 else if(d) return duplex_realtime;
303 int AudioDevice::get_orate()
305 if(w) return out_samplerate;
306 else if(d) return duplex_samplerate;
310 int AudioDevice::get_interrupted()
315 int AudioDevice::get_device_buffer()
317 return device_buffer;