Remove unnecessary locks now that the mixer doesn't require one

This commit is contained in:
Chris Robinson
2020-02-26 04:58:02 -08:00
parent 4555b74bd7
commit eb49290dab
18 changed files with 17 additions and 64 deletions
-3
View File
@@ -4233,10 +4233,7 @@ START_API_FUNC
else if(samples < 0 || (samples > 0 && buffer == nullptr))
alcSetError(dev.get(), ALC_INVALID_VALUE);
else
{
std::lock_guard<BackendBase> _{*dev->Backend};
aluMixData(dev.get(), buffer, static_cast<ALuint>(samples), dev->channelsFromFmt());
}
}
END_API_FUNC
+4 -4
View File
@@ -493,7 +493,7 @@ int AlsaPlayback::mixerProc()
avail -= avail%update_size;
// it is possible that contiguous areas are smaller, thus we use a loop
std::lock_guard<AlsaPlayback> _{*this};
std::lock_guard<std::recursive_mutex> _{mMutex};
while(avail > 0)
{
snd_pcm_uframes_t frames{avail};
@@ -573,9 +573,9 @@ int AlsaPlayback::mixerNoMMapProc()
continue;
}
std::lock_guard<AlsaPlayback> _{*this};
al::byte *WritePtr{mBuffer.data()};
avail = snd_pcm_bytes_to_frames(mPcmHandle, static_cast<ssize_t>(mBuffer.size()));
std::lock_guard<std::recursive_mutex> _{mMutex};
aluMixData(mDevice, WritePtr, static_cast<ALuint>(avail), frame_step);
while(avail > 0)
{
@@ -848,7 +848,7 @@ ClockLatency AlsaPlayback::getClockLatency()
{
ClockLatency ret;
std::lock_guard<AlsaPlayback> _{*this};
std::lock_guard<std::recursive_mutex> _{mMutex};
ret.ClockTime = GetDeviceClockTime(mDevice);
snd_pcm_sframes_t delay{};
int err{snd_pcm_delay(mPcmHandle, &delay)};
@@ -1168,7 +1168,7 @@ ClockLatency AlsaCapture::getClockLatency()
{
ClockLatency ret;
std::lock_guard<AlsaCapture> _{*this};
std::lock_guard<std::recursive_mutex> _{mMutex};
ret.ClockTime = GetDeviceClockTime(mDevice);
snd_pcm_sframes_t delay{};
int err{snd_pcm_delay(mPcmHandle, &delay)};
-3
View File
@@ -43,9 +43,6 @@ struct BackendBase {
virtual ClockLatency getClockLatency();
virtual void lock() { mMutex.lock(); }
virtual void unlock() { mMutex.unlock(); }
ALCdevice *mDevice;
std::recursive_mutex mMutex;
-1
View File
@@ -81,7 +81,6 @@ CoreAudioPlayback::~CoreAudioPlayback()
OSStatus CoreAudioPlayback::MixerProc(AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32,
UInt32, AudioBufferList *ioData) noexcept
{
std::lock_guard<CoreAudioPlayback> _{*this};
aluMixData(mDevice, ioData->mBuffers[0].mData, ioData->mBuffers[0].mDataByteSize/mFrameSize,
ioData->mBuffers[0].mNumberChannels);
return noErr;
-3
View File
@@ -276,18 +276,15 @@ FORCE_ALIGN int DSoundPlayback::mixerProc()
if(SUCCEEDED(err))
{
std::unique_lock<DSoundPlayback> dlock{*this};
aluMixData(mDevice, WritePtr1, WriteCnt1/FrameSize, FrameStep);
if(WriteCnt2 > 0)
aluMixData(mDevice, WritePtr2, WriteCnt2/FrameSize, FrameStep);
dlock.unlock();
mBuffer->Unlock(WritePtr1, WriteCnt1, WritePtr2, WriteCnt2);
}
else
{
ERR("Buffer lock error: %#lx\n", err);
std::lock_guard<DSoundPlayback> _{*this};
aluHandleDisconnect(mDevice, "Failed to lock output buffer: 0x%lx", err);
return 1;
}
+2 -4
View File
@@ -266,15 +266,12 @@ int JackPlayback::mixerProc()
const size_t frame_step{mDevice->channelsFromFmt()};
std::unique_lock<JackPlayback> dlock{*this};
while(!mKillNow.load(std::memory_order_acquire) &&
mDevice->Connected.load(std::memory_order_acquire))
{
if(mRing->writeSpace() < mDevice->UpdateSize)
{
dlock.unlock();
mSem.wait();
dlock.lock();
continue;
}
@@ -285,6 +282,7 @@ int JackPlayback::mixerProc()
ALuint len1{minu(static_cast<ALuint>(data.first.len), todo)};
ALuint len2{minu(static_cast<ALuint>(data.second.len), todo-len1)};
std::lock_guard<std::recursive_mutex> _{mMutex};
aluMixData(mDevice, data.first.buf, len1, frame_step);
if(len2 > 0)
aluMixData(mDevice, data.second.buf, len2, frame_step);
@@ -460,7 +458,7 @@ ClockLatency JackPlayback::getClockLatency()
{
ClockLatency ret;
std::lock_guard<JackPlayback> _{*this};
std::lock_guard<std::recursive_mutex> _{mMutex};
ret.ClockTime = GetDeviceClockTime(mDevice);
ret.Latency = std::chrono::seconds{mRing->readSpace()};
ret.Latency /= mDevice->Frequency;
-1
View File
@@ -86,7 +86,6 @@ int NullBackend::mixerProc()
}
while(avail-done >= mDevice->UpdateSize)
{
std::lock_guard<NullBackend> _{*this};
aluMixData(mDevice, nullptr, mDevice->UpdateSize, 0u);
done += mDevice->UpdateSize;
}
+3 -4
View File
@@ -230,7 +230,6 @@ int OpenSLPlayback::mixerProc()
const size_t frame_step{mDevice->channelsFromFmt()};
std::unique_lock<OpenSLPlayback> dlock{*this};
if(SL_RESULT_SUCCESS != result)
aluHandleDisconnect(mDevice, "Failed to get playback buffer: 0x%08x", result);
@@ -256,13 +255,12 @@ int OpenSLPlayback::mixerProc()
if(mRing->writeSpace() == 0)
{
dlock.unlock();
mSem.wait();
dlock.lock();
continue;
}
}
std::unique_lock<std::recursive_mutex> dlock{mMutex};
auto data = mRing->getWriteVector();
aluMixData(mDevice, data.first.buf,
static_cast<ALuint>(data.first.len*mDevice->UpdateSize), frame_step);
@@ -272,6 +270,7 @@ int OpenSLPlayback::mixerProc()
size_t todo{data.first.len + data.second.len};
mRing->writeAdvance(todo);
dlock.unlock();
for(size_t i{0};i < todo;i++)
{
@@ -611,7 +610,7 @@ ClockLatency OpenSLPlayback::getClockLatency()
{
ClockLatency ret;
std::lock_guard<OpenSLPlayback> _{*this};
std::lock_guard<std::recursive_mutex> _{mMutex};
ret.ClockTime = GetDeviceClockTime(mDevice);
ret.Latency = std::chrono::seconds{mRing->readSpace() * mDevice->UpdateSize};
ret.Latency /= mDevice->Frequency;
-3
View File
@@ -280,7 +280,6 @@ int OSSPlayback::mixerProc()
const size_t frame_step{mDevice->channelsFromFmt()};
const ALuint frame_size{mDevice->frameSizeFromFmt()};
std::unique_lock<OSSPlayback> dlock{*this};
while(!mKillNow.load(std::memory_order_acquire) &&
mDevice->Connected.load(std::memory_order_acquire))
{
@@ -288,9 +287,7 @@ int OSSPlayback::mixerProc()
pollitem.fd = mFd;
pollitem.events = POLLOUT;
dlock.unlock();
int pret{poll(&pollitem, 1, 1000)};
dlock.lock();
if(pret < 0)
{
if(errno == EINTR || errno == EAGAIN)
-1
View File
@@ -109,7 +109,6 @@ PortPlayback::~PortPlayback()
int PortPlayback::writeCallback(const void*, void *outputBuffer, unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo*, const PaStreamCallbackFlags) noexcept
{
std::lock_guard<PortPlayback> _{*this};
aluMixData(mDevice, outputBuffer, static_cast<ALuint>(framesPerBuffer),
mDevice->channelsFromFmt());
return 0;
-4
View File
@@ -710,8 +710,6 @@ struct PulsePlayback final : public BackendBase {
bool start() override;
void stop() override;
ClockLatency getClockLatency() override;
void lock() override { mMainloop.doLock(); }
void unlock() override { mMainloop.doUnlock(); }
PulseMainloop mMainloop;
@@ -1107,8 +1105,6 @@ struct PulseCapture final : public BackendBase {
ALCenum captureSamples(al::byte *buffer, ALCuint samples) override;
ALCuint availableSamples() override;
ClockLatency getClockLatency() override;
void lock() override { mMainloop.doLock(); }
void unlock() override { mMainloop.doUnlock(); }
PulseMainloop mMainloop;
-3
View File
@@ -207,7 +207,6 @@ FORCE_ALIGN static int qsa_proc_playback(void *ptr)
const ALint frame_size = device->frameSizeFromFmt();
std::unique_lock<PlaybackWrapper> dlock{*self};
while(!data->mKillNow.load(std::memory_order_acquire))
{
pollfd pollitem{};
@@ -215,9 +214,7 @@ FORCE_ALIGN static int qsa_proc_playback(void *ptr)
pollitem.events = POLLOUT;
/* Select also works like time slice to OS */
dlock.unlock();
sret = poll(&pollitem, 1, 2000);
dlock.lock();
if(sret == -1)
{
if(errno == EINTR || errno == EAGAIN)
-8
View File
@@ -60,8 +60,6 @@ struct Sdl2Backend final : public BackendBase {
bool reset() override;
bool start() override;
void stop() override;
void lock() override;
void unlock() override;
SDL_AudioDeviceID mDeviceID{0u};
ALuint mFrameSize{0};
@@ -181,12 +179,6 @@ bool Sdl2Backend::start()
void Sdl2Backend::stop()
{ SDL_PauseAudioDevice(mDeviceID, 1); }
void Sdl2Backend::lock()
{ SDL_LockAudioDevice(mDeviceID); }
void Sdl2Backend::unlock()
{ SDL_UnlockAudioDevice(mDeviceID); }
} // namespace
BackendFactory &SDL2BackendFactory::getFactory()
+1 -4
View File
@@ -86,10 +86,7 @@ int SndioPlayback::mixerProc()
ALubyte *WritePtr{mBuffer.data()};
size_t len{mBuffer.size()};
{
std::lock_guard<SndioPlayback> _{*this};
aluMixData(mDevice, WritePtr, static_cast<ALuint>(len/frameSize), frameStep);
}
aluMixData(mDevice, WritePtr, static_cast<ALuint>(len/frameSize), frameStep);
while(len > 0 && !mKillNow.load(std::memory_order_acquire))
{
size_t wrote{sio_write(mSndHandle, WritePtr, len)};
-3
View File
@@ -92,7 +92,6 @@ int SolarisBackend::mixerProc()
const size_t frame_step{mDevice->channelsFromFmt()};
const ALuint frame_size{mDevice->frameSizeFromFmt()};
std::unique_lock<SolarisBackend> dlock{*this};
while(!mKillNow.load(std::memory_order_acquire) &&
mDevice->Connected.load(std::memory_order_acquire))
{
@@ -100,9 +99,7 @@ int SolarisBackend::mixerProc()
pollitem.fd = mFd;
pollitem.events = POLLOUT;
dlock.unlock();
int pret{poll(&pollitem, 1, 1000)};
dlock.lock();
if(pret < 0)
{
if(errno == EINTR || errno == EAGAIN)
+6 -5
View File
@@ -715,10 +715,11 @@ FORCE_ALIGN int WasapiPlayback::mixerProc()
hr = mRender->GetBuffer(len, &buffer);
if(SUCCEEDED(hr))
{
std::unique_lock<WasapiPlayback> dlock{*this};
aluMixData(mDevice, buffer, len, mFrameStep);
mPadding.store(written + len, std::memory_order_relaxed);
dlock.unlock();
{
std::lock_guard<std::recursive_mutex> _{mMutex};
aluMixData(mDevice, buffer, len, mFrameStep);
mPadding.store(written + len, std::memory_order_relaxed);
}
hr = mRender->ReleaseBuffer(len, 0);
}
if(FAILED(hr))
@@ -1164,7 +1165,7 @@ ClockLatency WasapiPlayback::getClockLatency()
{
ClockLatency ret;
std::lock_guard<WasapiPlayback> _{*this};
std::lock_guard<std::recursive_mutex> _{mMutex};
ret.ClockTime = GetDeviceClockTime(mDevice);
ret.Latency = std::chrono::seconds{mPadding.load(std::memory_order_relaxed)};
ret.Latency /= mDevice->Frequency;
+1 -4
View File
@@ -146,10 +146,7 @@ int WaveBackend::mixerProc()
}
while(avail-done >= mDevice->UpdateSize)
{
{
std::lock_guard<WaveBackend> _{*this};
aluMixData(mDevice, mBuffer.data(), mDevice->UpdateSize, frameStep);
}
aluMixData(mDevice, mBuffer.data(), mDevice->UpdateSize, frameStep);
done += mDevice->UpdateSize;
if(!IS_LITTLE_ENDIAN)
-6
View File
@@ -182,16 +182,13 @@ FORCE_ALIGN int WinMMPlayback::mixerProc()
const size_t frame_step{mDevice->channelsFromFmt()};
std::unique_lock<WinMMPlayback> dlock{*this};
while(!mKillNow.load(std::memory_order_acquire) &&
mDevice->Connected.load(std::memory_order_acquire))
{
ALsizei todo = mWritable.load(std::memory_order_acquire);
if(todo < 1)
{
dlock.unlock();
mSem.wait();
dlock.lock();
continue;
}
@@ -422,16 +419,13 @@ int WinMMCapture::captureProc()
{
althrd_setname(RECORD_THREAD_NAME);
std::unique_lock<WinMMCapture> dlock{*this};
while(!mKillNow.load(std::memory_order_acquire) &&
mDevice->Connected.load(std::memory_order_acquire))
{
ALuint todo{mReadable.load(std::memory_order_acquire)};
if(todo < 1)
{
dlock.unlock();
mSem.wait();
dlock.lock();
continue;
}