in src/Custom/RealtimeConversation/RealtimeConversationSession.cs [47:83]
public virtual async Task SendInputAudioAsync(Stream audio, CancellationToken cancellationToken = default)
{
Argument.AssertNotNull(audio, nameof(audio));
using (await _audioSendSemaphore.AutoReleaseWaitAsync(cancellationToken).ConfigureAwait(false))
{
if (_isSendingAudioStream)
{
throw new InvalidOperationException($"Only one stream of audio may be sent at once.");
}
_isSendingAudioStream = true;
}
try
{
byte[] buffer = ArrayPool<byte>.Shared.Rent(1024 * 16);
while (true)
{
int bytesRead = await audio.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false);
if (bytesRead == 0)
{
break;
}
ReadOnlyMemory<byte> audioMemory = buffer.AsMemory(0, bytesRead);
BinaryData audioData = BinaryData.FromBytes(audioMemory);
InternalRealtimeClientEventInputAudioBufferAppend internalCommand = new(audioData);
BinaryData requestData = ModelReaderWriter.Write(internalCommand);
await SendCommandAsync(requestData, cancellationToken.ToRequestOptions()).ConfigureAwait(false);
}
}
finally
{
using (await _audioSendSemaphore.AutoReleaseWaitAsync(cancellationToken).ConfigureAwait(false))
{
_isSendingAudioStream = false;
}
}
}