소스 검색

clean ALRenderer implementation and fix cmake file

mikymod 12 년 전
부모
커밋
6c45cc72ed
3개의 변경된 파일51개의 추가작업 그리고 36개의 파일을 삭제
  1. 0 1
      engine/CMakeLists.txt
  2. 1 0
      engine/audio/al/ALRenderer.cpp
  3. 50 35
      engine/audio/al/ALRenderer.h

+ 0 - 1
engine/CMakeLists.txt

@@ -337,7 +337,6 @@ set (AUDIO_SRC)
 
 set (AUDIO_HEADERS
 	audio/SoundRenderer.h
-	audio/SoundSample.h
 	audio/OggDecoder.h
 )
 

+ 1 - 0
engine/audio/al/ALRenderer.cpp

@@ -143,6 +143,7 @@ void SoundRenderer::shutdown()
 //-----------------------------------------------------------------------------
 void SoundRenderer::frame()
 {
+	// TODO: needs additional works, but it's ok right now
 	for (uint32_t i = 0; i < m_num_sounds; i++)
 	{
 		if (m_backend->m_sounds[i].m_playing)

+ 50 - 35
engine/audio/al/ALRenderer.h

@@ -64,6 +64,7 @@ static const char* al_error_to_string(ALenum error)
 //-----------------------------------------------------------------------------
 struct Sound
 {
+public:
 	//-----------------------------------------------------------------------------
 	Sound() : 
 		m_res(NULL), 
@@ -82,11 +83,12 @@ struct Sound
 
 		// Generates AL source
 		AL_CHECK(alGenSources(1, &m_id));
+
 		AL_CHECK(alSourcef(m_id, AL_PITCH, 1.0f));
 		AL_CHECK(alSourcef(m_id, AL_REFERENCE_DISTANCE, 0.1f));
 		AL_CHECK(alSourcef(m_id, AL_MAX_DISTANCE, 1000.0f));
 
-		// Generates AL buffer
+		// Generates AL buffers
 		AL_CHECK(alGenBuffers(3, m_buffer));
 		
 		bool stereo = (m_res->channels() > 1);
@@ -115,19 +117,11 @@ struct Sound
 			}
 		}
 
+		m_streaming = m_res->sound_type() == ST_OGG;
 		// Streams resource if is ogg 
-		if (m_res->sound_type() == ST_OGG)
+		if (m_streaming)
 		{
-			m_streaming = true;
-			m_decoder.init((char*)m_res->data(), m_res->size());
-			m_decoder.stream();
-			AL_CHECK(alBufferData(m_buffer[0], m_format, m_decoder.data(), m_decoder.size(), m_res->sample_rate()));
-			m_decoder.stream();
-			AL_CHECK(alBufferData(m_buffer[1], m_format, m_decoder.data(), m_decoder.size(), m_res->sample_rate()));			
-			m_decoder.stream();
-			AL_CHECK(alBufferData(m_buffer[2], m_format, m_decoder.data(), m_decoder.size(), m_res->sample_rate()));
-
-			AL_CHECK(alSourceQueueBuffers(m_id, 3, m_buffer));
+			create_stream();
 		}
 		else
 		{
@@ -144,30 +138,9 @@ struct Sound
 		{
 			if (m_streaming)
 			{
-				uint32_t processed = processed_buffers();
-
-				while (processed--)
-				{
-					ALuint buffer;
-
-					AL_CHECK(alSourceUnqueueBuffers(m_id, 1, &buffer));
-
-					if (m_decoder.stream())
-					{
-						AL_CHECK(alBufferData(buffer, m_format, m_decoder.data(), m_decoder.size(), m_res->sample_rate()));
-					}
-					else if (m_looping)
-					{
-						Log::i("Restart sound");
-						m_decoder.rewind();
-						m_decoder.stream();
-						AL_CHECK(alBufferData(buffer, m_format, m_decoder.data(), m_decoder.size(), m_res->sample_rate()));
-					}
-
-
-					AL_CHECK(alSourceQueueBuffers(m_id, 1, &buffer));
-				}
+				update_stream();
 			}
+			// else ... nothing right now
 		}
 	}
 
@@ -374,6 +347,48 @@ struct Sound
 		return processed;
 	}
 
+private:
+
+	//-----------------------------------------------------------------------------
+	void create_stream()
+	{
+		m_decoder.init((char*)m_res->data(), m_res->size());
+		m_decoder.stream();
+		AL_CHECK(alBufferData(m_buffer[0], m_format, m_decoder.data(), m_decoder.size(), m_res->sample_rate()));
+		m_decoder.stream();
+		AL_CHECK(alBufferData(m_buffer[1], m_format, m_decoder.data(), m_decoder.size(), m_res->sample_rate()));			
+		m_decoder.stream();
+		AL_CHECK(alBufferData(m_buffer[2], m_format, m_decoder.data(), m_decoder.size(), m_res->sample_rate()));
+
+		AL_CHECK(alSourceQueueBuffers(m_id, 3, m_buffer));
+	}
+
+	//-----------------------------------------------------------------------------
+	void update_stream()
+	{
+		uint32_t processed = processed_buffers();
+
+		while (processed--)
+		{
+			ALuint buffer;
+
+			AL_CHECK(alSourceUnqueueBuffers(m_id, 1, &buffer));
+
+			if (m_decoder.stream())
+			{
+				AL_CHECK(alBufferData(buffer, m_format, m_decoder.data(), m_decoder.size(), m_res->sample_rate()));
+			}
+			else if (m_looping)
+			{
+				m_decoder.rewind();
+				m_decoder.stream();
+				AL_CHECK(alBufferData(buffer, m_format, m_decoder.data(), m_decoder.size(), m_res->sample_rate()));
+			}
+
+			AL_CHECK(alSourceQueueBuffers(m_id, 1, &buffer));
+		}
+	}
+
 public:
 
 	SoundResource*	m_res;