diff options
Diffstat (limited to 'modules/audio_device/linux')
4 files changed, 43 insertions, 89 deletions
diff --git a/modules/audio_device/linux/audio_device_alsa_linux.cc b/modules/audio_device/linux/audio_device_alsa_linux.cc index 1cc5761b7c..9e6bd168fc 100644 --- a/modules/audio_device/linux/audio_device_alsa_linux.cc +++ b/modules/audio_device/linux/audio_device_alsa_linux.cc @@ -178,26 +178,13 @@ int32_t AudioDeviceLinuxALSA::Terminate() { _mixerManager.Close(); // RECORDING - if (_ptrThreadRec) { - rtc::PlatformThread* tmpThread = _ptrThreadRec.release(); - mutex_.Unlock(); - - tmpThread->Stop(); - delete tmpThread; - - mutex_.Lock(); - } + mutex_.Unlock(); + _ptrThreadRec.Finalize(); // PLAYOUT - if (_ptrThreadPlay) { - rtc::PlatformThread* tmpThread = _ptrThreadPlay.release(); - mutex_.Unlock(); - - tmpThread->Stop(); - delete tmpThread; + _ptrThreadPlay.Finalize(); + mutex_.Lock(); - mutex_.Lock(); - } #if defined(WEBRTC_USE_X11) if (_XDisplay) { XCloseDisplay(_XDisplay); @@ -1040,11 +1027,13 @@ int32_t AudioDeviceLinuxALSA::StartRecording() { return -1; } // RECORDING - _ptrThreadRec.reset(new rtc::PlatformThread( - RecThreadFunc, this, "webrtc_audio_module_capture_thread", - rtc::kRealtimePriority)); - - _ptrThreadRec->Start(); + _ptrThreadRec = rtc::PlatformThread::SpawnJoinable( + [this] { + while (RecThreadProcess()) { + } + }, + "webrtc_audio_module_capture_thread", + rtc::ThreadAttributes().SetPriority(rtc::ThreadPriority::kRealtime)); errVal = LATE(snd_pcm_prepare)(_handleRecord); if (errVal < 0) { @@ -1088,10 +1077,7 @@ int32_t AudioDeviceLinuxALSA::StopRecordingLocked() { _recIsInitialized = false; _recording = false; - if (_ptrThreadRec) { - _ptrThreadRec->Stop(); - _ptrThreadRec.reset(); - } + _ptrThreadRec.Finalize(); _recordingFramesLeft = 0; if (_recordingBuffer) { @@ -1158,10 +1144,13 @@ int32_t AudioDeviceLinuxALSA::StartPlayout() { } // PLAYOUT - _ptrThreadPlay.reset(new rtc::PlatformThread( - PlayThreadFunc, this, "webrtc_audio_module_play_thread", - rtc::kRealtimePriority)); - _ptrThreadPlay->Start(); + _ptrThreadPlay = rtc::PlatformThread::SpawnJoinable( + [this] { + while (PlayThreadProcess()) { + } + }, + "webrtc_audio_module_play_thread", + rtc::ThreadAttributes().SetPriority(rtc::ThreadPriority::kRealtime)); int errVal = LATE(snd_pcm_prepare)(_handlePlayout); if (errVal < 0) { @@ -1191,10 +1180,7 @@ int32_t AudioDeviceLinuxALSA::StopPlayoutLocked() { _playing = false; // stop playout thread first - if (_ptrThreadPlay) { - _ptrThreadPlay->Stop(); - _ptrThreadPlay.reset(); - } + _ptrThreadPlay.Finalize(); _playoutFramesLeft = 0; delete[] _playoutBuffer; @@ -1469,18 +1455,6 @@ int32_t AudioDeviceLinuxALSA::ErrorRecovery(int32_t error, // Thread Methods // ============================================================================ -void AudioDeviceLinuxALSA::PlayThreadFunc(void* pThis) { - AudioDeviceLinuxALSA* device = static_cast<AudioDeviceLinuxALSA*>(pThis); - while (device->PlayThreadProcess()) { - } -} - -void AudioDeviceLinuxALSA::RecThreadFunc(void* pThis) { - AudioDeviceLinuxALSA* device = static_cast<AudioDeviceLinuxALSA*>(pThis); - while (device->RecThreadProcess()) { - } -} - bool AudioDeviceLinuxALSA::PlayThreadProcess() { if (!_playing) return false; diff --git a/modules/audio_device/linux/audio_device_alsa_linux.h b/modules/audio_device/linux/audio_device_alsa_linux.h index 410afcf42c..1f4a231640 100644 --- a/modules/audio_device/linux/audio_device_alsa_linux.h +++ b/modules/audio_device/linux/audio_device_alsa_linux.h @@ -155,10 +155,8 @@ class AudioDeviceLinuxALSA : public AudioDeviceGeneric { Mutex mutex_; - // TODO(pbos): Make plain members and start/stop instead of resetting these - // pointers. A thread can be reused. - std::unique_ptr<rtc::PlatformThread> _ptrThreadRec; - std::unique_ptr<rtc::PlatformThread> _ptrThreadPlay; + rtc::PlatformThread _ptrThreadRec; + rtc::PlatformThread _ptrThreadPlay; AudioMixerManagerLinuxALSA _mixerManager; diff --git a/modules/audio_device/linux/audio_device_pulse_linux.cc b/modules/audio_device/linux/audio_device_pulse_linux.cc index 3256a05803..7742420fc2 100644 --- a/modules/audio_device/linux/audio_device_pulse_linux.cc +++ b/modules/audio_device/linux/audio_device_pulse_linux.cc @@ -15,6 +15,7 @@ #include "modules/audio_device/linux/latebindingsymboltable_linux.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" +#include "rtc_base/platform_thread.h" WebRTCPulseSymbolTable* GetPulseSymbolTable() { static WebRTCPulseSymbolTable* pulse_symbol_table = @@ -158,18 +159,22 @@ AudioDeviceGeneric::InitStatus AudioDeviceLinuxPulse::Init() { #endif // RECORDING - _ptrThreadRec.reset(new rtc::PlatformThread(RecThreadFunc, this, - "webrtc_audio_module_rec_thread", - rtc::kRealtimePriority)); - - _ptrThreadRec->Start(); + const auto attributes = + rtc::ThreadAttributes().SetPriority(rtc::ThreadPriority::kRealtime); + _ptrThreadRec = rtc::PlatformThread::SpawnJoinable( + [this] { + while (RecThreadProcess()) { + } + }, + "webrtc_audio_module_rec_thread", attributes); // PLAYOUT - _ptrThreadPlay.reset(new rtc::PlatformThread( - PlayThreadFunc, this, "webrtc_audio_module_play_thread", - rtc::kRealtimePriority)); - _ptrThreadPlay->Start(); - + _ptrThreadPlay = rtc::PlatformThread::SpawnJoinable( + [this] { + while (PlayThreadProcess()) { + } + }, + "webrtc_audio_module_play_thread", attributes); _initialized = true; return InitStatus::OK; @@ -187,22 +192,12 @@ int32_t AudioDeviceLinuxPulse::Terminate() { _mixerManager.Close(); // RECORDING - if (_ptrThreadRec) { - rtc::PlatformThread* tmpThread = _ptrThreadRec.release(); - - _timeEventRec.Set(); - tmpThread->Stop(); - delete tmpThread; - } + _timeEventRec.Set(); + _ptrThreadRec.Finalize(); // PLAYOUT - if (_ptrThreadPlay) { - rtc::PlatformThread* tmpThread = _ptrThreadPlay.release(); - - _timeEventPlay.Set(); - tmpThread->Stop(); - delete tmpThread; - } + _timeEventPlay.Set(); + _ptrThreadPlay.Finalize(); // Terminate PulseAudio if (TerminatePulseAudio() < 0) { @@ -1981,18 +1976,6 @@ int32_t AudioDeviceLinuxPulse::ProcessRecordedData(int8_t* bufferData, return 0; } -void AudioDeviceLinuxPulse::PlayThreadFunc(void* pThis) { - AudioDeviceLinuxPulse* device = static_cast<AudioDeviceLinuxPulse*>(pThis); - while (device->PlayThreadProcess()) { - } -} - -void AudioDeviceLinuxPulse::RecThreadFunc(void* pThis) { - AudioDeviceLinuxPulse* device = static_cast<AudioDeviceLinuxPulse*>(pThis); - while (device->RecThreadProcess()) { - } -} - bool AudioDeviceLinuxPulse::PlayThreadProcess() { if (!_timeEventPlay.Wait(1000)) { return true; diff --git a/modules/audio_device/linux/audio_device_pulse_linux.h b/modules/audio_device/linux/audio_device_pulse_linux.h index cfad6b1c15..0cf89ef011 100644 --- a/modules/audio_device/linux/audio_device_pulse_linux.h +++ b/modules/audio_device/linux/audio_device_pulse_linux.h @@ -268,9 +268,8 @@ class AudioDeviceLinuxPulse : public AudioDeviceGeneric { rtc::Event _recStartEvent; rtc::Event _playStartEvent; - // TODO(pbos): Remove unique_ptr and use directly without resetting. - std::unique_ptr<rtc::PlatformThread> _ptrThreadPlay; - std::unique_ptr<rtc::PlatformThread> _ptrThreadRec; + rtc::PlatformThread _ptrThreadPlay; + rtc::PlatformThread _ptrThreadRec; AudioMixerManagerLinuxPulse _mixerManager; |