00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <WindowsAudioInputDevice_noMixer.hh>
00022
00024
00025 class AudioInputPort {
00026 public:
00027 void open(unsigned numChannels, unsigned samplingFrequency, unsigned granularityInMS);
00028 void open();
00029 void close();
00030
00031 public:
00032 int index;
00033 char name[MAXPNAMELEN];
00034 };
00035
00036
00038
00039 AudioInputDevice*
00040 AudioInputDevice::createNew(UsageEnvironment& env, int inputPortNumber,
00041 unsigned char bitsPerSample,
00042 unsigned char numChannels,
00043 unsigned samplingFrequency,
00044 unsigned granularityInMS) {
00045 Boolean success;
00046 WindowsAudioInputDevice* newSource
00047 = new WindowsAudioInputDevice(env, inputPortNumber,
00048 bitsPerSample, numChannels,
00049 samplingFrequency, granularityInMS,
00050 success);
00051 if (!success) {delete newSource; newSource = NULL;}
00052
00053 return newSource;
00054 }
00055
00056 AudioPortNames* AudioInputDevice::getPortNames() {
00057 WindowsAudioInputDevice::initializeIfNecessary();
00058
00059 AudioPortNames* portNames = new AudioPortNames;
00060 portNames->numPorts = WindowsAudioInputDevice::numAudioInputPorts;
00061 portNames->portName = new char*[WindowsAudioInputDevice::numAudioInputPorts];
00062
00063 for (unsigned i = 0; i < WindowsAudioInputDevice::numAudioInputPorts; ++i) {
00064 AudioInputPort& audioInputPort = WindowsAudioInputDevice::ourAudioInputPorts[i];
00065
00066 portNames->portName[i] = strDup(audioInputPort.name);
00067 }
00068
00069 return portNames;
00070 }
00071
00072
00074
00075 WindowsAudioInputDevice
00076 ::WindowsAudioInputDevice(UsageEnvironment& env, int inputPortNumber,
00077 unsigned char bitsPerSample,
00078 unsigned char numChannels,
00079 unsigned samplingFrequency,
00080 unsigned granularityInMS,
00081 Boolean& success)
00082 : WindowsAudioInputDevice_common(env, inputPortNumber,
00083 bitsPerSample, numChannels, samplingFrequency, granularityInMS) {
00084 success = initialSetInputPort(inputPortNumber);
00085 }
00086
00087 WindowsAudioInputDevice::~WindowsAudioInputDevice() {
00088 if (fCurPortIndex >= 0) ourAudioInputPorts[fCurPortIndex].close();
00089
00090 delete[] ourAudioInputPorts; ourAudioInputPorts = NULL;
00091 numAudioInputPorts = 0;
00092 }
00093
00094 void WindowsAudioInputDevice::initializeIfNecessary() {
00095 if (ourAudioInputPorts != NULL) return;
00096 numAudioInputPorts = waveInGetNumDevs();
00097 ourAudioInputPorts = new AudioInputPort[numAudioInputPorts];
00098
00099
00100 for (unsigned i = 0; i < numAudioInputPorts; ++i) {
00101 AudioInputPort& port = ourAudioInputPorts[i];
00102 port.index = i;
00103 port.open();
00104 port.close();
00105 }
00106 }
00107
00108 Boolean WindowsAudioInputDevice::setInputPort(int portIndex) {
00109 initializeIfNecessary();
00110
00111 if (portIndex < 0 || portIndex >= (int)numAudioInputPorts) {
00112 envir().setResultMsg("Bad input port index\n");
00113 return False;
00114 }
00115
00116
00117 if (allowedDeviceNames != NULL) {
00118 int i;
00119 for (i = 0; allowedDeviceNames[i] != NULL; ++i) {
00120 if (strncmp(ourAudioInputPorts[portIndex].name, allowedDeviceNames[i],
00121 strlen(allowedDeviceNames[i])) == 0) {
00122
00123 break;
00124 }
00125 }
00126 if (allowedDeviceNames[i] == NULL) {
00127 envir().setResultMsg("Access to this audio device is not allowed\n");
00128 return False;
00129 }
00130 }
00131
00132 if (portIndex != fCurPortIndex) {
00133
00134 if (fCurPortIndex >= 0) ourAudioInputPorts[fCurPortIndex].close();;
00135 fCurPortIndex = portIndex;
00136 ourAudioInputPorts[fCurPortIndex].open(fNumChannels, fSamplingFrequency, fGranularityInMS);
00137 }
00138 fCurPortIndex = portIndex;
00139 return True;
00140 }
00141
00142 unsigned WindowsAudioInputDevice::numAudioInputPorts = 0;
00143
00144 AudioInputPort* WindowsAudioInputDevice::ourAudioInputPorts = NULL;
00145
00146
00148
00149 void AudioInputPort::open(unsigned numChannels, unsigned samplingFrequency, unsigned granularityInMS) {
00150 do {
00151
00152 WAVEINCAPS wic;
00153 if (waveInGetDevCaps(index, &wic, sizeof wic) != MMSYSERR_NOERROR) {
00154 name[0] = '\0';
00155 break;
00156 }
00157 strncpy(name, wic.szPname, MAXPNAMELEN);
00158
00159 if (!WindowsAudioInputDevice_common::openWavInPort(index, numChannels, samplingFrequency, granularityInMS)) break;
00160
00161 return;
00162 } while (0);
00163
00164
00165 close();
00166 }
00167
00168 void AudioInputPort::open() {
00169 open(1, 8000, 20);
00170 }
00171
00172 void AudioInputPort::close() {
00173 WindowsAudioInputDevice_common::waveIn_close();
00174 }