00001 #ifndef AUDIODRV_H_
00002 #define AUDIODRV_H_
00003
00004 #include <qtimer.h>
00005 #include <qptrlist.h>
00006 #include <qthread.h>
00007 #include <qdatetime.h>
00008
00009 #ifdef WIN32
00010 #include <windows.h>
00011 #include <io.h>
00012 #include <sstream>
00013 #include <mmsystem.h>
00014 #include <Dsound.h>
00015 #else
00016 #include <mythtv/audiooutput.h>
00017 #endif
00018
00019
00020 #define MAX_COMP_AUDIO_SIZE 320 // This would equate to 40ms sample size
00021 #define MAX_DECOMP_AUDIO_SAMPLES (MAX_COMP_AUDIO_SIZE) // CHANGE FOR HIGHER COMPRESSION CODECS; G.711 has same no. samples after decomp.
00022 #define PCM_SAMPLES_PER_MS 8
00023
00024
00025 #define NUM_MIC_BUFFERS 32
00026 #define MIC_BUFFER_SIZE MAX_DECOMP_AUDIO_SAMPLES
00027 #define NUM_SPK_BUFFERS 1
00028 #define SPK_BUFFER_SIZE (PCM_SAMPLES_PER_MS * 1000 * 10)
00029
00030
00031 #define DS_SPK_BUFFER_SIZE (PCM_SAMPLES_PER_MS * 1000 * 10)
00032 #define DS_SPK_BUFFER_BYTES (DS_SPK_BUFFER_SIZE*2)
00033 #define DS_NUM_MIC_BUFFERS 32
00034
00035
00036 class AudioDriver
00037 {
00038 public:
00039 AudioDriver(int mCap) { micCaptureSamples = mCap;};
00040 virtual ~AudioDriver() {};
00041 virtual void StartSpeaker() {};
00042 virtual void Open() {};
00043 virtual void Close() {};
00044 virtual int Write(short *, int) {return 0;};
00045 virtual int WriteSilence(int samples);
00046 virtual int msOutQueued() {return 0;};
00047 virtual int samplesOutSpaceRemaining() {return 0;};
00048 virtual bool anyMicrophoneData() {return false;};
00049 virtual int Read(short *, int) { return 0;};
00050 protected:
00051 int micCaptureSamples;
00052 };
00053
00054 #ifdef WIN32
00055 class waveAudioDriver : public AudioDriver
00056 {
00057 public:
00058 waveAudioDriver(QString s, QString m, int mCap);
00059 ~waveAudioDriver();
00060 virtual void StartSpeaker();
00061 virtual void Open();
00062 virtual void Close();
00063 virtual int Write(short *data, int samples);
00064 virtual int msOutQueued();
00065 virtual int samplesOutSpaceRemaining();
00066 virtual bool anyMicrophoneData();
00067 virtual int Read(short *buffer, int maxSamples);
00068 private:
00069 bool openSpeaker();
00070 bool openMicrophone();
00071 bool closeMicrophone();
00072 bool closeSpeaker();
00073
00074
00075 int MicDevice;
00076 int SpeakerDevice;
00077 HWAVEIN hMicrophone;
00078 WAVEHDR micBufferDescr[NUM_MIC_BUFFERS];
00079 short MicBuffer[NUM_MIC_BUFFERS][MIC_BUFFER_SIZE];
00080 int micCurrBuffer;
00081 HWAVEOUT hSpeaker;
00082 WAVEHDR spkBufferDescr[NUM_SPK_BUFFERS];
00083 short SpkBuffer[NUM_SPK_BUFFERS][SPK_BUFFER_SIZE];
00084 int spkIndex;
00085 int spkInBuffer;
00086 };
00087
00088 class dsAudioDriver : public AudioDriver
00089 {
00090 public:
00091 dsAudioDriver(QString s, QString m, int mCap, HWND hMainWindow);
00092 ~dsAudioDriver();
00093 virtual void StartSpeaker();
00094 virtual void Open();
00095 virtual void Close();
00096 virtual int Write(short *data, int samples);
00097 virtual int msOutQueued();
00098 virtual int samplesOutSpaceRemaining();
00099 virtual bool anyMicrophoneData();
00100 virtual int Read(short *buffer, int maxSamples);
00101 void dsEnumerateCallback(LPGUID lpGUID, LPCTSTR lpszDesc, LPCTSTR lpszDrvName);
00102 private:
00103 bool openSpeaker();
00104 bool openMicrophone();
00105 bool closeMicrophone();
00106 bool closeSpeaker();
00107 QString spkName;
00108 QString micName;
00109 GUID *spkGuid;
00110 GUID *micGuid;
00111 bool enumerateSpeaker;
00112 IDirectSound *spkDS;
00113 IDirectSoundCapture *micDS;
00114 IDirectSoundBuffer *dsSpkBuffer;
00115 IDirectSoundCaptureBuffer *dsMicBuffer;
00116 unsigned char *dsSpkMemory;
00117 int spkByteIndex;
00118 int lastPlayPos;
00119 int playBufferWraps;
00120 int lastReadPos;
00121 int micBufferBytes;
00122 };
00123 #endif
00124
00125 #ifndef WIN32
00126 class ossAudioDriver : public AudioDriver
00127 {
00128 public:
00129 ossAudioDriver(QString s, QString m, int mCap);
00130 ~ossAudioDriver();
00131 virtual void StartSpeaker();
00132 virtual void Open();
00133 virtual void Close();
00134 virtual int Write(short *data, int samples);
00135 virtual int msOutQueued();
00136 virtual int samplesOutSpaceRemaining();
00137 virtual bool anyMicrophoneData();
00138 virtual int Read(short *buffer, int maxSamples);
00139 private:
00140 int OpenAudioDevice(QString devName, int mode);
00141 int speakerFd;
00142 int microphoneFd;
00143 QString spkDevice;
00144 QString micDevice;
00145 bool readAnyData;
00146 };
00147 #endif
00148
00149 #ifndef WIN32
00150 class mythAudioDriver : public AudioDriver
00151 {
00152 public:
00153 mythAudioDriver(QString s, QString m, int mCap);
00154 ~mythAudioDriver();
00155 virtual void StartSpeaker();
00156 virtual void Open();
00157 virtual void Close();
00158 virtual int Write(short *data, int samples);
00159 virtual int msOutQueued();
00160 virtual int samplesOutSpaceRemaining();
00161 virtual bool anyMicrophoneData();
00162 virtual int Read(short *buffer, int maxSamples);
00163 private:
00164 int OpenAudioDevice(QString devName, int mode);
00165 AudioOutput *mythOutput;
00166 int microphoneFd;
00167 QString spkDevice;
00168 QString micDevice;
00169 bool readAnyData;
00170 };
00171 #endif
00172
00173
00174 #endif