sdlxGetAudioStreamData function audio

TypedData? sdlxGetAudioStreamData(
  1. Pointer<SdlAudioStream> stream,
  2. int maxLenInBytes
)

Get converted/resampled data from the stream.

The input/output data format/channels/samplerate is specified when creating the stream, and can be changed after creation by calling SDL_SetAudioStreamFormat.

Note that any conversion and resampling necessary is done during this call, and SDL_PutAudioStreamData simply queues unconverted data for later. This is different than SDL2, where that work was done while inputting new data to the stream and requesting the output just copied the converted data.

\param stream the stream the audio is being requested from. \param buf a buffer to fill with audio data. \param len the maximum number of bytes to fill. \returns the number of bytes read from the stream or -1 on failure; call SDL_GetError() for more information.

\threadsafety It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.

\since This function is available since SDL 3.2.0.

\sa SDL_ClearAudioStream \sa SDL_GetAudioStreamAvailable \sa SDL_PutAudioStreamData

extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamData(SDL_AudioStream *stream, void *buf, int len)

Implementation

TypedData? sdlxGetAudioStreamData(
  Pointer<SdlAudioStream> stream,
  int maxLenInBytes,
) {
  final spec = SdlxAudioSpec();
  final success = sdlxGetAudioStreamFormat(stream, spec, null);
  if (!success) {
    return null;
  }
  final format = spec.format;
  final bufPointer = sdlMalloc(maxLenInBytes).cast<Uint8>();
  if (bufPointer == nullptr) {
    return null;
  }
  final bytesRead = sdlGetAudioStreamData(
    stream,
    bufPointer.cast(),
    maxLenInBytes,
  );
  if (bytesRead <= 0) {
    sdlFree(bufPointer);
    return null;
  }
  TypedData? result;
  final byteBuffer = bufPointer.asTypedList(bytesRead).buffer;
  switch (format) {
    case SDL_AUDIO_S8:
      result = Int8List.fromList(byteBuffer.asInt8List());
    case SDL_AUDIO_U8:
      result = Uint8List.fromList(bufPointer.asTypedList(bytesRead));
    case SDL_AUDIO_S16LE:
    case SDL_AUDIO_S16BE:
      result = Int16List.fromList(byteBuffer.asInt16List());
    case SDL_AUDIO_S32LE:
    case SDL_AUDIO_S32BE:
      result = Int32List.fromList(byteBuffer.asInt32List());
    case SDL_AUDIO_F32LE:
    case SDL_AUDIO_F32BE:
      result = Float32List.fromList(byteBuffer.asFloat32List());
  }
  sdlFree(bufPointer);
  return result;
}