From 3de68707d1f8cf9ab7ae84617429d5e5af2566c1 Mon Sep 17 00:00:00 2001 From: Raidho Date: Tue, 25 Oct 2016 02:05:53 +0300 Subject: [PATCH] made device enumeration lazy made enumerator to first attempt aquire default device name by standard means, then to fall back to read name from opened device getRecordingDeviceCount removed for being redundant --HG-- branch : minor-mic-input --- src/modules/audio/Audio.h | 15 +--- src/modules/audio/null/Audio.cpp | 14 +--- src/modules/audio/null/Audio.h | 5 +- src/modules/audio/openal/Audio.cpp | 72 +++++++++----------- src/modules/audio/openal/Audio.h | 4 +- src/modules/audio/openal/RecordingDevice.cpp | 2 +- src/modules/audio/wrap_Audio.cpp | 17 ++--- 7 files changed, 45 insertions(+), 84 deletions(-) diff --git a/src/modules/audio/Audio.h b/src/modules/audio/Audio.h index 9a0d43aba..c10ffe813 100644 --- a/src/modules/audio/Audio.h +++ b/src/modules/audio/Audio.h @@ -190,20 +190,9 @@ public: virtual float getDopplerScale() const = 0; /** - * @return Number of recording devices. + * @return Reference to a vector of pointers to recording devices. May be empty. **/ - virtual int getRecordingDeviceCount() const = 0; - - /** - * @param index Index number of recording device. 0 is default device. - * @return Selected recording device. - **/ - virtual RecordingDevice *getRecordingDevice(int index) const = 0; - - /** - * @return Index number of a recording device, -1 if not present. - **/ - virtual int getRecordingDeviceIndex(RecordingDevice *device) const = 0; + virtual std::vector *getRecordingDevices() = 0; /** * Gets the distance model used for attenuation. diff --git a/src/modules/audio/null/Audio.cpp b/src/modules/audio/null/Audio.cpp index 85d48c629..957129978 100644 --- a/src/modules/audio/null/Audio.cpp +++ b/src/modules/audio/null/Audio.cpp @@ -144,19 +144,9 @@ float Audio::getDopplerScale() const return 1.0f; } -int Audio::getRecordingDeviceCount() const +std::vector *Audio::getRecordingDevices() { - return 0; -} - -love::audio::RecordingDevice *Audio::getRecordingDevice(int index) const -{ - return nullptr; -} - -int Audio::getRecordingDeviceIndex(love::audio::RecordingDevice *device) const -{ - return -1; + return &capture; } Audio::DistanceModel Audio::getDistanceModel() const diff --git a/src/modules/audio/null/Audio.h b/src/modules/audio/null/Audio.h index a2c82e031..3f841fec5 100644 --- a/src/modules/audio/null/Audio.h +++ b/src/modules/audio/null/Audio.h @@ -71,9 +71,7 @@ public: void setDopplerScale(float scale); float getDopplerScale() const; - int getRecordingDeviceCount() const; - love::audio::RecordingDevice *getRecordingDevice(int index) const; - int getRecordingDeviceIndex(love::audio::RecordingDevice *device) const; + std::vector *getRecordingDevices(); DistanceModel getDistanceModel() const; void setDistanceModel(DistanceModel distanceModel); @@ -81,6 +79,7 @@ public: private: float volume; DistanceModel distanceModel; + std::vector capture; }; // Audio diff --git a/src/modules/audio/openal/Audio.cpp b/src/modules/audio/openal/Audio.cpp index cb9b45f09..6283b293b 100644 --- a/src/modules/audio/openal/Audio.cpp +++ b/src/modules/audio/openal/Audio.cpp @@ -110,29 +110,6 @@ Audio::Audio() if (!alcMakeContextCurrent(context) || alcGetError(device) != ALC_NO_ERROR) throw love::Exception("Could not make context current."); - //find and push default capture device - //AL may not return actual device name string when asked directly - std::string defaultname; - ALCdevice *defaultdevice = alcCaptureOpenDevice(NULL, 8000, 8, 1); - if (alGetError() == AL_NO_ERROR) - { - defaultname = alcGetString(defaultdevice, ALC_CAPTURE_DEVICE_SPECIFIER); - alcCaptureCloseDevice(defaultdevice); - capture.push_back(new RecordingDevice(defaultname.c_str(), 0)); - } - - const ALCchar *devstr = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER); - size_t offset = 0; - while (true) - { - if (devstr[offset] == '\0') - break; - std::string str((ALCchar*)&devstr[offset]); - if (str != defaultname) - capture.push_back(new RecordingDevice(str.c_str(), capture.size())); - offset += str.length() + 1; - } - // pool must be allocated after AL context. try { @@ -336,26 +313,41 @@ void Audio::setDistanceModel(DistanceModel distanceModel) } } -int Audio::getRecordingDeviceCount() const +std::vector *Audio::getRecordingDevices() { - return capture.size(); -} + if (capture.size() == 0) + { + std::string defaultname(alcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER)); -love::audio::RecordingDevice *Audio::getRecordingDevice(int index) const -{ - if (index < 0 || (unsigned int)index >= capture.size()) - return nullptr; + //no device name obtained from AL, fallback to reading from device + if (defaultname.length() == 0) + { + //use some safe basic parameters - 8 kHz, 8 bits, 1 channel + ALCdevice *defaultdevice = alcCaptureOpenDevice(NULL, 8000, 8, 1); + if (alGetError() == AL_NO_ERROR) + { + defaultname = alcGetString(defaultdevice, ALC_CAPTURE_DEVICE_SPECIFIER); + alcCaptureCloseDevice(defaultdevice); + } + else + //failed to open default recording device - bail, return empty list + return &capture; + } + capture.push_back(new RecordingDevice(defaultname.c_str(), 0)); - return capture[index]; -} - -int Audio::getRecordingDeviceIndex(love::audio::RecordingDevice *device) const -{ - for (unsigned int i = 0; i < capture.size(); i++) - if (device == capture[i]) - return i; - - return -1; + const ALCchar *devstr = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER); + size_t offset = 0; + while (true) + { + if (devstr[offset] == '\0') + break; + std::string str((ALCchar*)&devstr[offset]); + if (str != defaultname) + capture.push_back(new RecordingDevice(str.c_str(), capture.size())); + offset += str.length() + 1; + } + } + return &capture; } } // openal diff --git a/src/modules/audio/openal/Audio.h b/src/modules/audio/openal/Audio.h index 846e0e54c..469586d59 100644 --- a/src/modules/audio/openal/Audio.h +++ b/src/modules/audio/openal/Audio.h @@ -105,9 +105,7 @@ public: void setDopplerScale(float scale); float getDopplerScale() const; - int getRecordingDeviceCount() const; - love::audio::RecordingDevice *getRecordingDevice(int index) const; - int getRecordingDeviceIndex(love::audio::RecordingDevice *device) const; + std::vector *getRecordingDevices(); DistanceModel getDistanceModel() const; void setDistanceModel(DistanceModel distanceModel); diff --git a/src/modules/audio/openal/RecordingDevice.cpp b/src/modules/audio/openal/RecordingDevice.cpp index abae69571..b8d29f27c 100644 --- a/src/modules/audio/openal/RecordingDevice.cpp +++ b/src/modules/audio/openal/RecordingDevice.cpp @@ -155,7 +155,7 @@ int RecordingDevice::getID() const bool RecordingDevice::isRecording() const { - return device == nullptr ? false : true; + return device != nullptr; } } //openal diff --git a/src/modules/audio/wrap_Audio.cpp b/src/modules/audio/wrap_Audio.cpp index 90ee82a82..175f1d4af 100644 --- a/src/modules/audio/wrap_Audio.cpp +++ b/src/modules/audio/wrap_Audio.cpp @@ -277,21 +277,15 @@ int w_getDistanceModel(lua_State *L) return 1; } -int w_getRecordingDeviceCount(lua_State *L) -{ - lua_pushnumber(L, instance()->getRecordingDeviceCount()); - return 1; -} - int w_getRecordingDevices(lua_State *L) { - int count = instance()->getRecordingDeviceCount(); - lua_createtable(L, count, 0); + std::vector *devices = instance()->getRecordingDevices(); - for (int i = 0; i < count; i++) + lua_createtable(L, (*devices).size(), 0); + + for (unsigned int i = 0; i < (*devices).size(); i++) { - RecordingDevice *device = instance()->getRecordingDevice(i); - luax_pushtype(L, AUDIO_RECORDING_DEVICE_ID, device); + luax_pushtype(L, AUDIO_RECORDING_DEVICE_ID, (*devices)[i]); lua_rawseti(L, -2, i + 1); } @@ -319,7 +313,6 @@ static const luaL_Reg functions[] = { "getDopplerScale", w_getDopplerScale }, { "setDistanceModel", w_setDistanceModel }, { "getDistanceModel", w_getDistanceModel }, - { "getRecordingDeviceCount", w_getRecordingDeviceCount }, { "getRecordingDevices", w_getRecordingDevices }, { 0, 0 } };