Pārlūkot izejas kodu

Merge pull request #4772 from Laserlicht/mixer_audio_duration

fix: use sdl mixer to get audio duration
Ivan Savenko 1 gadu atpakaļ
vecāks
revīzija
94a0de716a
1 mainītis faili ar 15 papildinājumiem un 9 dzēšanām
  1. 15 9
      client/media/CSoundHandler.cpp

+ 15 - 9
client/media/CSoundHandler.cpp

@@ -147,18 +147,24 @@ uint32_t CSoundHandler::getSoundDurationMilliseconds(const AudioPath & sound)
 
 	auto data = CResourceHandler::get()->load(resourcePath)->readAll();
 
-	SDL_AudioSpec spec;
-	uint32_t audioLen;
-	uint8_t * audioBuf;
 	uint32_t milliseconds = 0;
 
-	if(SDL_LoadWAV_RW(SDL_RWFromMem(data.first.get(), data.second), 1, &spec, &audioBuf, &audioLen) != nullptr)
+	Mix_Chunk * chunk = Mix_LoadWAV_RW(SDL_RWFromMem(data.first.get(), data.second), 1);
+
+	int freq = 0;
+	Uint16 fmt = 0;
+	int channels = 0;
+	if(!Mix_QuerySpec(&freq, &fmt, &channels))
+		return 0;
+
+	if(chunk != nullptr)
 	{
-		SDL_FreeWAV(audioBuf);
-		uint32_t sampleSize = SDL_AUDIO_BITSIZE(spec.format) / 8;
-		uint32_t sampleCount = audioLen / sampleSize;
-		uint32_t sampleLen = sampleCount / spec.channels;
-		milliseconds = 1000 * sampleLen / spec.freq;
+		Uint32 sampleSizeBytes = (fmt & 0xFF) / 8;
+		Uint32 samples = (chunk->alen / sampleSizeBytes);
+		Uint32 frames = (samples / channels);
+		milliseconds = ((frames * 1000) / freq);
+
+		Mix_FreeChunk(chunk);
 	}
 
 	return milliseconds;