diff --git a/include/SDL3/SDL_audio.h b/include/SDL3/SDL_audio.h index ba01d7d11a..be5eb32e9b 100644 --- a/include/SDL3/SDL_audio.h +++ b/include/SDL3/SDL_audio.h @@ -2035,85 +2035,6 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyAudioStream(SDL_AudioStream *stream) */ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_OpenAudioDeviceStream(SDL_AudioDeviceID devid, const SDL_AudioSpec *spec, SDL_AudioStreamCallback callback, void *userdata); -/** - * A callback that fires around an audio device's processing work. - * - * This callback fires when a logical audio device is about to start accessing - * its bound audio streams, and fires again when it has finished accessing - * them. It covers the range of one "iteration" of the audio device. - * - * It can be useful to use this callback to update state that must apply to - * all bound audio streams atomically: to make sure state changes don't happen - * while half of the streams are already processed for the latest audio - * buffer. - * - * This callback should run as quickly as possible and not block for any - * significant time, as this callback delays submission of data to the audio - * device, which can cause audio playback problems. This callback delays all - * audio processing across a single physical audio device: all its logical - * devices and all bound audio streams. Use it carefully. - * - * \param userdata a pointer provided by the app through - * SDL_SetAudioPostmixCallback, for its own use. - * \param devid the audio device this callback is running for. - * \param start true if this is the start of the iteration, false if the end. - * - * \threadsafety This will run from a background thread owned by SDL. The - * application is responsible for locking resources the callback - * touches that need to be protected. - * - * \since This datatype is available since SDL 3.4.0. - * - * \sa SDL_SetAudioIterationCallbacks - */ -typedef void (SDLCALL *SDL_AudioIterationCallback)(void *userdata, SDL_AudioDeviceID devid, bool start); - -/** - * Set callbacks that fire around a new iteration of audio device processing. - * - * Two callbacks are provided here: one that runs when a device is about to - * process its bound audio streams, and another that runs when the device has - * finished processing them. - * - * These callbacks can run at any time, and from any thread; if you need to - * serialize access to your app's data, you should provide and use a mutex or - * other synchronization device. - * - * Generally these callbacks are used to apply state that applies to multiple - * bound audio streams, with a guarantee that the audio device's thread isn't - * halfway through processing them. Generally a finer-grained lock through - * SDL_LockAudioStream() is more appropriate. - * - * The callbacks are extremely time-sensitive; the callback should do the - * least amount of work possible and return as quickly as it can. The longer - * the callback runs, the higher the risk of audio dropouts or other problems. - * - * This function will block until the audio device is in between iterations, - * so any existing callback that might be running will finish before this - * function sets the new callback and returns. - * - * Physical devices do not accept these callbacks, only logical devices - * created through SDL_OpenAudioDevice() can be. - * - * Setting a NULL callback function disables any previously-set callback. - * Either callback may be NULL, and the same callback is permitted to be used - * for both. - * - * \param devid the ID of an opened audio device. - * \param start a callback function to be called at the start of an iteration. - * Can be NULL. - * \param end a callback function to be called at the end of an iteration. Can - * be NULL. - * \param userdata app-controlled pointer passed to callback. Can be NULL. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \threadsafety It is safe to call this function from any thread. - * - * \since This function is available since SDL 3.4.0. - */ -extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioIterationCallbacks(SDL_AudioDeviceID devid, SDL_AudioIterationCallback start, SDL_AudioIterationCallback end, void *userdata); - /** * A callback that fires when data is about to be fed to an audio device. * diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index b1956175c6..8b0ecab202 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -1164,23 +1164,9 @@ bool SDL_PlaybackAudioThreadIterate(SDL_AudioDevice *device) // We should have updated this elsewhere if the format changed! SDL_assert(SDL_AudioSpecsEqual(&stream->dst_spec, &device->spec, NULL, NULL)); - SDL_assert(stream->src_spec.format != SDL_AUDIO_UNKNOWN); - int br = 0; - - if (!SDL_GetAtomicInt(&logdev->paused)) { - if (logdev->iteration_start) { - logdev->iteration_start(logdev->iteration_userdata, logdev->instance_id, true); - } - - br = SDL_GetAudioStreamDataAdjustGain(stream, device_buffer, buffer_size, logdev->gain); - - if (logdev->iteration_end) { - logdev->iteration_end(logdev->iteration_userdata, logdev->instance_id, false); - } - } - + const int br = SDL_GetAtomicInt(&logdev->paused) ? 0 : SDL_GetAudioStreamDataAdjustGain(stream, device_buffer, buffer_size, logdev->gain); if (br < 0) { // Probably OOM. Kill the audio device; the whole thing is likely dying soon anyhow. failed = true; SDL_memset(device_buffer, device->silence_value, buffer_size); // just supply silence to the device before we die. @@ -1218,10 +1204,6 @@ bool SDL_PlaybackAudioThreadIterate(SDL_AudioDevice *device) SDL_memset(mix_buffer, '\0', work_buffer_size); // start with silence. } - if (logdev->iteration_start) { - logdev->iteration_start(logdev->iteration_userdata, logdev->instance_id, true); - } - for (SDL_AudioStream *stream = logdev->bound_streams; stream; stream = stream->next_binding) { // We should have updated this elsewhere if the format changed! SDL_assert(SDL_AudioSpecsEqual(&stream->dst_spec, &outspec, NULL, NULL)); @@ -1246,10 +1228,6 @@ bool SDL_PlaybackAudioThreadIterate(SDL_AudioDevice *device) } } - if (logdev->iteration_end) { - logdev->iteration_end(logdev->iteration_userdata, logdev->instance_id, false); - } - if (postmix) { SDL_assert(mix_buffer == device->postmix_buffer); postmix(logdev->postmix_userdata, &outspec, mix_buffer, work_buffer_size); @@ -1991,21 +1969,6 @@ bool SDL_SetAudioPostmixCallback(SDL_AudioDeviceID devid, SDL_AudioPostmixCallba return result; } -bool SDL_SetAudioIterationCallbacks(SDL_AudioDeviceID devid, SDL_AudioIterationCallback iter_start, SDL_AudioIterationCallback iter_end, void *userdata) -{ - SDL_AudioDevice *device = NULL; - SDL_LogicalAudioDevice *logdev = ObtainLogicalAudioDevice(devid, &device); - bool result = false; - if (logdev) { - logdev->iteration_start = iter_start; - logdev->iteration_end = iter_end; - logdev->iteration_userdata = userdata; - result = true; - } - ReleaseAudioDevice(device); - return result; -} - bool SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream * const *streams, int num_streams) { const bool islogical = !(devid & (1<<1)); diff --git a/src/audio/SDL_sysaudio.h b/src/audio/SDL_sysaudio.h index 603eaab197..3b3cb9b37e 100644 --- a/src/audio/SDL_sysaudio.h +++ b/src/audio/SDL_sysaudio.h @@ -264,13 +264,6 @@ struct SDL_LogicalAudioDevice // true if device was opened with SDL_OpenAudioDeviceStream (so it forbids binding changes, etc). bool simplified; - // If non-NULL, callback into the app that alerts it to start/end of device iteration. - SDL_AudioIterationCallback iteration_start; - SDL_AudioIterationCallback iteration_end; - - // App-supplied pointer for iteration callbacks. - void *iteration_userdata; - // If non-NULL, callback into the app that lets them access the final postmix buffer. SDL_AudioPostmixCallback postmix; diff --git a/src/dynapi/SDL_dynapi.sym b/src/dynapi/SDL_dynapi.sym index 86abbbd12f..fcae64bea6 100644 --- a/src/dynapi/SDL_dynapi.sym +++ b/src/dynapi/SDL_dynapi.sym @@ -1251,7 +1251,6 @@ SDL3_0.0.0 { SDL_GetGPUDeviceProperties; SDL_CreateGPURenderer; SDL_PutAudioStreamPlanarData; - SDL_SetAudioIterationCallbacks; SDL_GetEventDescription; SDL_PutAudioStreamDataNoCopy; SDL_IsTraySupported; diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h index a2f02b2708..8873ff4734 100644 --- a/src/dynapi/SDL_dynapi_overrides.h +++ b/src/dynapi/SDL_dynapi_overrides.h @@ -1276,7 +1276,6 @@ #define SDL_GetGPUDeviceProperties SDL_GetGPUDeviceProperties_REAL #define SDL_CreateGPURenderer SDL_CreateGPURenderer_REAL #define SDL_PutAudioStreamPlanarData SDL_PutAudioStreamPlanarData_REAL -#define SDL_SetAudioIterationCallbacks SDL_SetAudioIterationCallbacks_REAL #define SDL_GetEventDescription SDL_GetEventDescription_REAL #define SDL_PutAudioStreamDataNoCopy SDL_PutAudioStreamDataNoCopy_REAL #define SDL_IsTraySupported SDL_IsTraySupported_REAL diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 08ba54c2cb..f05ff2ff33 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -1284,7 +1284,6 @@ SDL_DYNAPI_PROC(bool,SDL_GetRenderTextureAddressMode,(SDL_Renderer *a,SDL_Textur SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetGPUDeviceProperties,(SDL_GPUDevice *a),(a),return) SDL_DYNAPI_PROC(SDL_Renderer*,SDL_CreateGPURenderer,(SDL_Window *a,SDL_GPUShaderFormat b,SDL_GPUDevice **c),(a,b,c),return) SDL_DYNAPI_PROC(bool,SDL_PutAudioStreamPlanarData,(SDL_AudioStream *a,const void * const*b,int c,int d),(a,b,c,d),return) -SDL_DYNAPI_PROC(bool,SDL_SetAudioIterationCallbacks,(SDL_AudioDeviceID a,SDL_AudioIterationCallback b,SDL_AudioIterationCallback c,void *d),(a,b,c,d),return) SDL_DYNAPI_PROC(int,SDL_GetEventDescription,(const SDL_Event *a,char *b,int c),(a,b,c),return) SDL_DYNAPI_PROC(bool,SDL_PutAudioStreamDataNoCopy,(SDL_AudioStream *a,const void *b,int c,SDL_AudioStreamDataCompleteCallback d,void *e),(a,b,c,d,e),return) SDL_DYNAPI_PROC(bool,SDL_IsTraySupported,(void),(),return)