in src/Custom/RealtimeConversation/RealtimeConversationSession.cs [85:121]
public virtual void SendInputAudio(Stream audio, CancellationToken cancellationToken = default)
{
Argument.AssertNotNull(audio, nameof(audio));
using (_audioSendSemaphore.AutoReleaseWait(cancellationToken))
{
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 = audio.Read(buffer, 0, buffer.Length);
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);
SendCommand(requestData, cancellationToken.ToRequestOptions());
}
}
finally
{
using (_audioSendSemaphore.AutoReleaseWait(cancellationToken))
{
_isSendingAudioStream = false;
}
}
}