SoundSDL: lock conditional code cleanup
Move the `bool lock` condition used to wait for sound data to be exhausted from two places in the code into the `bool should_wait()` member function.
This commit is contained in:
parent
03a20820cb
commit
5e9c9093c0
|
@ -39,18 +39,17 @@ void SoundSDL::soundCallback(void *data, uint8_t *stream, int len)
|
||||||
reinterpret_cast<SoundSDL*>(data)->read(reinterpret_cast<uint16_t *>(stream), len);
|
reinterpret_cast<SoundSDL*>(data)->read(reinterpret_cast<uint16_t *>(stream), len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SoundSDL::should_wait()
|
||||||
|
{
|
||||||
|
return emulating && !speedup && throttle && !gba_joybus_active;
|
||||||
|
}
|
||||||
|
|
||||||
void SoundSDL::read(uint16_t * stream, int length)
|
void SoundSDL::read(uint16_t * stream, int length)
|
||||||
{
|
{
|
||||||
if (!_initialized || length <= 0 || !emulating)
|
if (!_initialized || length <= 0 || !emulating)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (should_wait())
|
||||||
/* since this is running in a different thread, speedup and
|
|
||||||
* throttle can change at any time; save the value so locks
|
|
||||||
* stay in sync */
|
|
||||||
bool lock = (emulating && !speedup && throttle && !gba_joybus_active) ? true : false;
|
|
||||||
|
|
||||||
if (lock)
|
|
||||||
SDL_SemWait (_semBufferFull);
|
SDL_SemWait (_semBufferFull);
|
||||||
|
|
||||||
SDL_mutexP(_mutex);
|
SDL_mutexP(_mutex);
|
||||||
|
@ -77,8 +76,6 @@ void SoundSDL::write(uint16_t * finalWave, int length)
|
||||||
std::size_t avail;
|
std::size_t avail;
|
||||||
while ((avail = _rbuf.avail() / 2) < samples)
|
while ((avail = _rbuf.avail() / 2) < samples)
|
||||||
{
|
{
|
||||||
bool lock = (emulating && !speedup && throttle && !gba_joybus_active) ? true : false;
|
|
||||||
|
|
||||||
_rbuf.write(finalWave, avail * 2);
|
_rbuf.write(finalWave, avail * 2);
|
||||||
|
|
||||||
finalWave += avail * 2;
|
finalWave += avail * 2;
|
||||||
|
@ -86,7 +83,7 @@ void SoundSDL::write(uint16_t * finalWave, int length)
|
||||||
|
|
||||||
SDL_mutexV(_mutex);
|
SDL_mutexV(_mutex);
|
||||||
SDL_SemPost(_semBufferFull);
|
SDL_SemPost(_semBufferFull);
|
||||||
if (lock)
|
if (should_wait())
|
||||||
{
|
{
|
||||||
SDL_SemWait(_semBufferEmpty);
|
SDL_SemWait(_semBufferEmpty);
|
||||||
if (throttle > 0 && throttle != current_rate)
|
if (throttle > 0 && throttle != current_rate)
|
||||||
|
|
|
@ -34,6 +34,7 @@ class SoundSDL : public SoundDriver
|
||||||
virtual void reset();
|
virtual void reset();
|
||||||
virtual void resume();
|
virtual void resume();
|
||||||
virtual void write(uint16_t *finalWave, int length);
|
virtual void write(uint16_t *finalWave, int length);
|
||||||
|
virtual bool should_wait();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RingBuffer<uint16_t> _rbuf;
|
RingBuffer<uint16_t> _rbuf;
|
||||||
|
|
Loading…
Reference in New Issue