|
|
@ -801,20 +801,26 @@ void ResumeMusicStream(Music music) |
|
|
|
} |
|
|
|
|
|
|
|
// Stop music playing (close stream) |
|
|
|
// TODO: To clear a buffer, make sure they have been already processed! |
|
|
|
void StopMusicStream(Music music) |
|
|
|
{ |
|
|
|
alSourceStop(music->stream.source); |
|
|
|
|
|
|
|
/* |
|
|
|
// Clear stream buffers |
|
|
|
// WARNING: Queued buffers must have been processed before unqueueing and reloaded with data!!! |
|
|
|
void *pcm = calloc(AUDIO_BUFFER_SIZE*music->stream.sampleSize/8*music->stream.channels, 1); |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < MAX_STREAM_BUFFERS; i++) |
|
|
|
{ |
|
|
|
UpdateAudioStream(music->stream, pcm, AUDIO_BUFFER_SIZE); |
|
|
|
//alBufferData(music->stream.buffers[i], music->stream.format, pcm, AUDIO_BUFFER_SIZE*music->stream.sampleSize/8*music->stream.channels, music->stream.sampleRate); |
|
|
|
|
|
|
|
|
|
|
|
//UpdateAudioStream(music->stream, pcm, AUDIO_BUFFER_SIZE); // Update one buffer at a time |
|
|
|
alBufferData(music->stream.buffers[i], music->stream.format, pcm, AUDIO_BUFFER_SIZE*music->stream.sampleSize/8*music->stream.channels, music->stream.sampleRate); |
|
|
|
} |
|
|
|
|
|
|
|
free(pcm); |
|
|
|
*/ |
|
|
|
|
|
|
|
// Restart music context |
|
|
|
switch (music->ctxType) |
|
|
@ -896,9 +902,9 @@ void UpdateMusicStream(Music music) |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// This error is registered when UpdateAudioStream() fails |
|
|
|
k">if (alGetError() == AL_INVALID_VALUE) TraceLog(WARNING, "OpenAL: Error buffering data..."); |
|
|
|
|
|
|
|
// Free allocated pcm data |
|
|
|
n">free(pcm); |
|
|
|
|
|
|
|
// Reset audio stream for looping |
|
|
|
if (!active) |
|
|
@ -918,8 +924,6 @@ void UpdateMusicStream(Music music) |
|
|
|
// just make sure to play again on window restore |
|
|
|
if (state != AL_PLAYING) PlayMusicStream(music); |
|
|
|
} |
|
|
|
|
|
|
|
free(pcm); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -1066,7 +1070,8 @@ void CloseAudioStream(AudioStream stream) |
|
|
|
} |
|
|
|
|
|
|
|
// Update audio stream buffers with data |
|
|
|
// NOTE: Only updates one buffer per call |
|
|
|
// NOTE 1: Only updates one buffer of the stream source: unqueue -> update -> queue |
|
|
|
// NOTE 2: To unqueue a buffer it needs to be processed: IsAudioBufferProcessed() |
|
|
|
void UpdateAudioStream(AudioStream stream, const void *data, int samplesCount) |
|
|
|
{ |
|
|
|
ALuint buffer = 0; |
|
|
@ -1075,9 +1080,10 @@ void UpdateAudioStream(AudioStream stream, const void *data, int samplesCount) |
|
|
|
// Check if any buffer was available for unqueue |
|
|
|
if (alGetError() != AL_INVALID_VALUE) |
|
|
|
{ |
|
|
|
alBufferData(buffer, stream.format, data, samplesCount*stream.channels*stream.sampleSize/8, stream.sampleRate); |
|
|
|
alBufferData(buffer, stream.format, data, samplesCount*stream.sampleSize/8*stream.channels, stream.sampleRate); |
|
|
|
alSourceQueueBuffers(stream.source, 1, &buffer); |
|
|
|
} |
|
|
|
else TraceLog(WARNING, "[AUD ID %i] Audio buffer not available for unqueuing", stream.source); |
|
|
|
} |
|
|
|
|
|
|
|
// Check if any audio stream buffers requires refill |
|
|
|