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 } };