浏览代码

-different attempt to avod deadlock problem

Juan Linietsky 9 年之前
父节点
当前提交
49a19f85b8
共有 3 个文件被更改,包括 23 次插入11 次删除
  1. 4 2
      scene/audio/stream_player.cpp
  2. 1 1
      scene/audio/stream_player.h
  3. 18 8
      servers/audio/audio_server_sw.cpp

+ 4 - 2
scene/audio/stream_player.cpp

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

+ 1 - 1
scene/audio/stream_player.h

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

+ 18 - 8
servers/audio/audio_server_sw.cpp

@@ -693,18 +693,28 @@ void AudioServerSW::stream_set_active(RID p_stream, bool p_active) {
 
 	Stream *s = stream_owner.get(p_stream);
 	ERR_FAIL_COND(!s);
+	_THREAD_SAFE_METHOD_
 
 	if (s->active==p_active)
 		return;
-	AUDIO_LOCK;
-	_THREAD_SAFE_METHOD_
-	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
+		lock();
+	}
+	{
+		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 {