00001 #ifndef AUDIODEVICE_H
00002 #define AUDIODEVICE_H
00003
00004 #include <fcntl.h>
00005 #include <stdio.h>
00006 #include <stdlib.h>
00007 #include <sys/ioctl.h>
00008 #include <unistd.h>
00009
00010 #include "audioalsa.inc"
00011 #include "audioconfig.inc"
00012 #include "audiodvb.inc"
00013 #include "audiodevice.inc"
00014 #include "audioesound.inc"
00015 #include "audiooss.inc"
00016 #include "bctimer.inc"
00017 #include "binary.h"
00018 #include "condition.inc"
00019 #include "dcoffset.inc"
00020 #include "device1394output.inc"
00021 #include "maxchannels.h"
00022 #include "mutex.inc"
00023 #include "mwindow.inc"
00024 #include "preferences.inc"
00025 #include "recordgui.inc"
00026 #include "sema.inc"
00027 #include "thread.h"
00028 #include "videodevice.inc"
00029 #ifdef HAVE_FIREWIRE
00030 #include "audio1394.inc"
00031 #include "device1394output.inc"
00032 #include "vdevice1394.inc"
00033 #endif
00034
00035 class AudioLowLevel
00036 {
00037 public:
00038 AudioLowLevel(AudioDevice *device);
00039 virtual ~AudioLowLevel();
00040
00041 virtual int open_input() { return 1; };
00042 virtual int open_output() { return 1; };
00043 virtual int open_duplex() { return 1; };
00044 virtual int close_all() { return 1; };
00045 virtual int interrupt_crash() { return 0; };
00046 virtual int64_t device_position() { return -1; };
00047 virtual int write_buffer(char *buffer, int size) { return 1; };
00048 virtual int read_buffer(char *buffer, int size) { return 1; };
00049 virtual int flush_device() { return 1; };
00050 virtual int interrupt_playback() { return 1; };
00051
00052 AudioDevice *device;
00053 };
00054
00055
00056 class AudioDevice : public Thread
00057 {
00058 public:
00059
00060 AudioDevice(MWindow *mwindow = 0);
00061 ~AudioDevice();
00062
00063 friend class AudioALSA;
00064 friend class AudioDVB;
00065 friend class AudioOSS;
00066 friend class AudioESound;
00067 friend class Audio1394;
00068 friend class VDevice1394;
00069 friend class Device1394Output;
00070
00071 int open_input(AudioInConfig *config,
00072 VideoInConfig *vconfig,
00073 int rate,
00074 int samples,
00075 int channels,
00076 int realtime);
00077 int open_output(AudioOutConfig *config,
00078 int rate,
00079 int samples,
00080 int channels,
00081 int realtime);
00082 int close_all();
00083 int reset_output();
00084 int restart();
00085
00086
00087 int set_vdevice(VideoDevice *vdevice);
00088
00089
00090
00091
00092
00093 int read_buffer(double **input,
00094 int samples,
00095 int *over,
00096 double *max,
00097 int input_offset = 0);
00098 int set_record_dither(int value);
00099
00100 void start_recording();
00101 int stop_recording();
00102
00103 int interrupt_crash();
00104
00105
00106
00107
00108 int write_buffer(double **output, int samples);
00109
00110
00111 void run();
00112
00113 void run_output();
00114
00115 void run_input();
00116
00117
00118
00119
00120 int set_last_buffer();
00121
00122 int wait_for_startup();
00123
00124 int wait_for_completion();
00125
00126
00127 int start_playback();
00128
00129
00130
00131
00132 int interrupt_playback();
00133 int set_play_dither(int status);
00134
00135 int set_software_positioning(int status = 1);
00136
00137
00138 int64_t current_position();
00139
00140 int get_interrupted();
00141 int get_device_buffer();
00142
00143 AudioLowLevel* get_lowlevel_out();
00144 AudioLowLevel* get_lowlevel_in();
00145
00146 private:
00147 int initialize();
00148
00149 int create_lowlevel(AudioLowLevel* &lowlevel, int driver);
00150 int arm_buffer(int buffer, double **output, int samples);
00151 int get_obits();
00152 int get_ochannels();
00153 int get_ibits();
00154 int get_ichannels();
00155 int get_orate();
00156 int get_irate();
00157 int get_orealtime();
00158 int get_irealtime();
00159
00160
00161 int in_samplerate, in_bits, in_channels, in_samples;
00162 int in_realtime;
00163 int out_samplerate, out_bits, out_channels, out_samples;
00164 int duplex_samplerate, duplex_bits, duplex_channels, duplex_samples;
00165 int out_realtime, duplex_realtime;
00166
00167
00168 int r, w, d;
00169
00170 int osamples, isamples, dsamples;
00171
00172 VideoDevice *vdevice;
00173
00174
00175
00176 int record_before_play;
00177 Condition *duplex_lock;
00178 Condition *startup_lock;
00179
00180 int duplex_init;
00181
00182 int rec_dither;
00183
00184 int play_dither;
00185 int sharing;
00186
00187
00188 int buffer_size[TOTAL_BUFFERS];
00189 int last_buffer[TOTAL_BUFFERS];
00190
00191 char *output_buffer[TOTAL_BUFFERS];
00192 char *input_buffer[TOTAL_BUFFERS];
00193 Sema *play_lock[TOTAL_BUFFERS];
00194 Sema *arm_lock[TOTAL_BUFFERS];
00195 Mutex *timer_lock;
00196
00197 int read_waiting;
00198 Mutex *buffer_lock;
00199 Condition *polling_lock;
00200 int arm_buffer_num;
00201
00202
00203 int total_samples;
00204
00205 int last_buffer_size;
00206 int position_correction;
00207 int device_buffer;
00208
00209 int last_position;
00210 Timer *playback_timer;
00211 Timer *record_timer;
00212
00213 int is_playing_back;
00214 int is_recording;
00215 int global_timer_started;
00216 int software_position_info;
00217 int interrupt;
00218 int driver;
00219
00220
00221 AudioLowLevel *lowlevel_in, *lowlevel_out, *lowlevel_duplex;
00222
00223 AudioOutConfig *out_config;
00224 AudioInConfig *in_config;
00225
00226 VideoInConfig *vconfig;
00227
00228
00229 int thread_buffer_num;
00230 int thread_result;
00231 int64_t total_samples_read;
00232 MWindow *mwindow;
00233 };
00234
00235
00236
00237 #endif