|
@@ -657,9 +657,12 @@ int SDL_PutAudioStreamData(SDL_AudioStream *stream, const void *buf, int len)
|
|
|
retval = SDL_WriteToAudioQueue(stream->queue, &stream->src_spec, buf, len);
|
|
|
}
|
|
|
|
|
|
- if ((retval == 0) && stream->put_callback) {
|
|
|
- const int newavail = SDL_GetAudioStreamAvailable(stream) - prev_available;
|
|
|
- stream->put_callback(stream->put_callback_userdata, stream, newavail, newavail);
|
|
|
+ if (retval == 0) {
|
|
|
+ stream->total_frames_queued += len / SDL_AUDIO_FRAMESIZE(stream->src_spec);
|
|
|
+ if (stream->put_callback) {
|
|
|
+ const int newavail = SDL_GetAudioStreamAvailable(stream) - prev_available;
|
|
|
+ stream->put_callback(stream->put_callback_userdata, stream, newavail, newavail);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
SDL_UnlockMutex(stream->lock);
|
|
@@ -858,6 +861,8 @@ static int GetAudioStreamDataInternal(SDL_AudioStream *stream, void *buf, int ou
|
|
|
SDL_assert(!"Not enough data in queue (read)");
|
|
|
}
|
|
|
|
|
|
+ stream->total_frames_queued -= output_frames;
|
|
|
+
|
|
|
// Even if we aren't currently resampling, we always need to update the history buffer
|
|
|
UpdateAudioStreamHistoryBuffer(stream, input_buffer, input_bytes, NULL, 0);
|
|
|
|
|
@@ -946,6 +951,7 @@ static int GetAudioStreamDataInternal(SDL_AudioStream *stream, void *buf, int ou
|
|
|
if (SDL_ReadFromAudioQueue(stream->queue, input_buffer, input_bytes) != 0) {
|
|
|
SDL_assert(!"Not enough data in queue (resample read)");
|
|
|
}
|
|
|
+ stream->total_frames_queued -= input_frames;
|
|
|
|
|
|
// Update the history buffer and fill in the left padding
|
|
|
UpdateAudioStreamHistoryBuffer(stream, input_buffer, input_bytes, left_padding, padding_bytes);
|
|
@@ -1083,7 +1089,7 @@ int SDL_GetAudioStreamData(SDL_AudioStream *stream, void *voidbuf, int len)
|
|
|
return total;
|
|
|
}
|
|
|
|
|
|
-// number of converted/resampled bytes available
|
|
|
+// number of converted/resampled bytes available for output
|
|
|
int SDL_GetAudioStreamAvailable(SDL_AudioStream *stream)
|
|
|
{
|
|
|
if (!stream) {
|
|
@@ -1108,6 +1114,21 @@ int SDL_GetAudioStreamAvailable(SDL_AudioStream *stream)
|
|
|
return (int) SDL_min(count, SDL_INT_MAX);
|
|
|
}
|
|
|
|
|
|
+// number of sample frames that are currently queued as input.
|
|
|
+int SDL_GetAudioStreamQueued(SDL_AudioStream *stream)
|
|
|
+{
|
|
|
+ if (!stream) {
|
|
|
+ return SDL_InvalidParamError("stream");
|
|
|
+ }
|
|
|
+
|
|
|
+ SDL_LockMutex(stream->lock);
|
|
|
+ const Uint64 total = stream->total_frames_queued;
|
|
|
+ SDL_UnlockMutex(stream->lock);
|
|
|
+
|
|
|
+ // if this overflows an int, just clamp it to a maximum.
|
|
|
+ return (int) SDL_min(total, SDL_INT_MAX);
|
|
|
+}
|
|
|
+
|
|
|
int SDL_ClearAudioStream(SDL_AudioStream *stream)
|
|
|
{
|
|
|
if (stream == NULL) {
|
|
@@ -1119,6 +1140,7 @@ int SDL_ClearAudioStream(SDL_AudioStream *stream)
|
|
|
SDL_ClearAudioQueue(stream->queue);
|
|
|
SDL_zero(stream->input_spec);
|
|
|
stream->resample_offset = 0;
|
|
|
+ stream->total_frames_queued = 0;
|
|
|
|
|
|
SDL_UnlockMutex(stream->lock);
|
|
|
return 0;
|