mirror of https://github.com/stella-emu/stella.git
Fix crash on audio settings change.
This commit is contained in:
parent
8c4faf122b
commit
ae88a5b6b6
|
@ -40,6 +40,7 @@
|
||||||
"ratio": "cpp",
|
"ratio": "cpp",
|
||||||
"tuple": "cpp",
|
"tuple": "cpp",
|
||||||
"type_traits": "cpp",
|
"type_traits": "cpp",
|
||||||
"stdexcept": "cpp"
|
"stdexcept": "cpp",
|
||||||
|
"fstream": "cpp"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,3 +132,15 @@ Int16* AudioQueue::dequeue(Int16* fragment)
|
||||||
|
|
||||||
return nextFragment;
|
return nextFragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void AudioQueue::closeSink(Int16* fragment)
|
||||||
|
{
|
||||||
|
lock_guard<mutex> guard(myMutex);
|
||||||
|
|
||||||
|
if (myFirstFragmentForDequeue && fragment)
|
||||||
|
throw new runtime_error("attempt to return unknown buffer on closeSink");
|
||||||
|
|
||||||
|
if (!myFirstFragmentForDequeue)
|
||||||
|
myFirstFragmentForDequeue = fragment;
|
||||||
|
}
|
||||||
|
|
|
@ -86,15 +86,21 @@ class AudioQueue
|
||||||
Int16* enqueue(Int16* fragment = 0);
|
Int16* enqueue(Int16* fragment = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dequeue a fragment for playback and return the played fragment. This may
|
Dequeue a fragment for playback and return the played fragment. This may
|
||||||
* return 0 if there is no queued fragment to return (in this case, the returned
|
return 0 if there is no queued fragment to return (in this case, the returned
|
||||||
* fragment is not enqueued and must be passed in the next invocation).
|
fragment is not enqueued and must be passed in the next invocation).
|
||||||
*
|
|
||||||
* @param fragment The returned fragment. This must be empty on the first call (when
|
@param fragment The returned fragment. This must be empty on the first call (when
|
||||||
* there is nothing to return).
|
there is nothing to return).
|
||||||
*/
|
*/
|
||||||
Int16* dequeue(Int16* fragment = 0);
|
Int16* dequeue(Int16* fragment = 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return the currently playing fragment without drawing a new one. This is called
|
||||||
|
if the sink is closed and prepares the queue to be reopened.
|
||||||
|
*/
|
||||||
|
void closeSink(Int16* fragment);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// The size of an individual fragment (in stereo / mono samples)
|
// The size of an individual fragment (in stereo / mono samples)
|
||||||
|
|
|
@ -143,6 +143,7 @@ void SoundSDL2::close()
|
||||||
|
|
||||||
mute(true);
|
mute(true);
|
||||||
|
|
||||||
|
if (myAudioQueue) myAudioQueue->closeSink(myCurrentFragment);
|
||||||
myAudioQueue = 0;
|
myAudioQueue = 0;
|
||||||
myCurrentFragment = 0;
|
myCurrentFragment = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue