-different attempt to avod deadlock problem

This commit is contained in:
Juan Linietsky 2015-12-21 10:25:46 -03:00
parent 15429d6ac9
commit 49a19f85b8
3 changed files with 23 additions and 11 deletions

View file

@ -67,7 +67,7 @@ bool StreamPlayer::sp_mix(int32_t *p_buffer,int p_frames) {
void StreamPlayer::sp_update() { void StreamPlayer::sp_update() {
_THREAD_SAFE_METHOD_ //_THREAD_SAFE_METHOD_
if (!paused && resampler.is_ready() && playback.is_valid()) { if (!paused && resampler.is_ready() && playback.is_valid()) {
if (!playback->is_playing()) { if (!playback->is_playing()) {
@ -143,6 +143,8 @@ void StreamPlayer::play(float p_from_offset) {
return; return;
//if (is_playing()) //if (is_playing())
stop(); stop();
//_THREAD_SAFE_METHOD_
playback->play(p_from_offset); playback->play(p_from_offset);
//feed the ringbuffer as long as no update callback is going on //feed the ringbuffer as long as no update callback is going on
sp_update(); sp_update();
@ -160,8 +162,8 @@ void StreamPlayer::stop() {
if (playback.is_null()) if (playback.is_null())
return; return;
//_THREAD_SAFE_METHOD_
AudioServer::get_singleton()->stream_set_active(stream_rid,false); AudioServer::get_singleton()->stream_set_active(stream_rid,false);
_THREAD_SAFE_METHOD_
playback->stop(); playback->stop();
resampler.flush(); resampler.flush();

View file

@ -37,7 +37,7 @@ class StreamPlayer : public Node {
OBJ_TYPE(StreamPlayer,Node); OBJ_TYPE(StreamPlayer,Node);
_THREAD_SAFE_CLASS_ //_THREAD_SAFE_CLASS_
struct InternalStream : public AudioServer::AudioStream { struct InternalStream : public AudioServer::AudioStream {
StreamPlayer *player; StreamPlayer *player;

View file

@ -693,18 +693,28 @@ void AudioServerSW::stream_set_active(RID p_stream, bool p_active) {
Stream *s = stream_owner.get(p_stream); Stream *s = stream_owner.get(p_stream);
ERR_FAIL_COND(!s); ERR_FAIL_COND(!s);
_THREAD_SAFE_METHOD_
if (s->active==p_active) if (s->active==p_active)
return; return;
AUDIO_LOCK; if (!thread || thread->get_ID()!=Thread::get_caller_ID()) {
_THREAD_SAFE_METHOD_ //do not lock in mix thread
s->active=p_active; lock();
if (p_active)
s->E=active_audio_streams.push_back(s);
else {
active_audio_streams.erase(s->E);
s->E=NULL;
} }
{
s->active=p_active;
if (p_active)
s->E=active_audio_streams.push_back(s);
else {
active_audio_streams.erase(s->E);
s->E=NULL;
}
}
if (!thread || thread->get_ID()!=Thread::get_caller_ID()) {
//do not lock in mix thread
unlock();
}
} }
bool AudioServerSW::stream_is_active(RID p_stream) const { bool AudioServerSW::stream_is_active(RID p_stream) const {