internal static unsafe void SetVolume(AudioStream *pThis, float volume) { OSStatus status = API.AudioQueueSetParameter(pThis->Queue, AudioQueueParameter.Volume, volume); API.CheckStatus(status); }
static unsafe void ReadBufferInternal(void *pUserData, AudioQueue *pQueue, AudioQueueBuffer *pBuffer) { AudioStream *pThis = (AudioStream *)pUserData; if (pThis == null) { Console.WriteLine("ReadBufferProc: pThis is null"); } if (!pThis->IsRunning) { return; } if (pQueue == null) { Console.WriteLine("ReadBufferProc: pQueue is null"); } if (pBuffer == null) { Console.WriteLine("ReadBufferProc: pBuffer is null"); } if (pBuffer->AudioData == null) { Console.WriteLine("ReadBufferProc: pBuffer->AudioData is null"); } if (pBuffer->PacketDescriptors == null) { Console.WriteLine("ReadBufferProc: pBuffer->PacketDescriptors is null"); } if (pThis->AudioFile == null) { Console.WriteLine("ReadBufferProc: pThis->AudioFile is null"); } int numPacketsReadFromFile = pThis->NumPacketsToRead; int numBytesReadFromFile = 0; OSStatus status = API.AudioFileReadPackets(pThis->AudioFile, 0, &numBytesReadFromFile, pBuffer->PacketDescriptors, pThis->CurrentPacket, &numPacketsReadFromFile, pBuffer->AudioData); API.CheckStatus(status); if (status == 0 && numPacketsReadFromFile == 0 && pThis->Looping) { // we ran out of packets and they are // asking to loop, so try and reset pThis->CurrentPacket = 0; numPacketsReadFromFile = pThis->NumPacketsToRead; numBytesReadFromFile = 0; status = API.AudioFileReadPackets(pThis->AudioFile, 0, &numBytesReadFromFile, pBuffer->PacketDescriptors, pThis->CurrentPacket, &numPacketsReadFromFile, pBuffer->AudioData); API.CheckStatus(status); } if (numPacketsReadFromFile > 0) { pBuffer->AudioDataByteSize = numBytesReadFromFile; pBuffer->PacketDescriptorCount = numPacketsReadFromFile; status = API.AudioQueueEnqueueBuffer(pThis->Queue, pBuffer, (pBuffer->PacketDescriptors != null ? pBuffer->PacketDescriptorCount : 0), pBuffer->PacketDescriptors); API.CheckStatus(status); pThis->CurrentPacket += numPacketsReadFromFile; } else { status = API.AudioQueueStop(pThis->Queue, 0); API.CheckStatus(status); } }