-different attempt to avod deadlock problem
This commit is contained in:
parent
15429d6ac9
commit
49a19f85b8
3 changed files with 23 additions and 11 deletions
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue