/// <summary> /// Streams audio into a floating point sample buffer. /// </summary> /// <param name="unityBuffer"></param> /// <param name="intermediateBuffer">A PCM sample buffer to act as an intermediary between the raw audio stream and Unity.</param> /// <param name="audioStream"></param> /// <returns>Returns the number of samples that were read from the stream.</returns> public static int FillUnityStreamBuffer(float[] unityBuffer, PCMAudioBuffer intermediateBuffer, MP3StreamReader audioStream) { if (audioStream.isDoneStreaming) { // Fill the Unity sample buffer with zeros. Array.Clear(unityBuffer, 0, unityBuffer.Length); return(0); } var totalSampleFramesToRead = unityBuffer.Length / audioStream.channelCount; var sampleFramesRead = 0; while (sampleFramesRead < totalSampleFramesToRead) { // Read some sample frames. var sampleFramesLeftToRead = totalSampleFramesToRead - sampleFramesRead; var sampleFramesReturned = audioStream.ReadSampleFrames(intermediateBuffer.data, 0, Math.Min(sampleFramesLeftToRead, intermediateBuffer.sampleFrameCount)); if (sampleFramesReturned > 0) { // Convert the read samples to floats copy them to the output buffer. intermediateBuffer.ToFloatArray(unityBuffer, sampleFramesRead, sampleFramesReturned); sampleFramesRead += sampleFramesReturned; } else { // Fill the rest of the Unity sample buffer with zeros. var samplesRead = sampleFramesRead * audioStream.channelCount; Array.Clear(unityBuffer, samplesRead, unityBuffer.Length - samplesRead); break; } } return(sampleFramesRead * audioStream.channelCount); }
public static AudioClip CreateAudioClip(string name, PCMAudioBuffer audioBuffer) { var sampleData = audioBuffer.ToFloatArray(); var audioClip = AudioClip.Create(name, sampleData.Length, audioBuffer.channelCount, audioBuffer.samplingRate, false); audioClip.SetData(sampleData, 0); return(audioClip); }
/// <summary> /// Create a Unity audio clip for an audio stream. /// </summary> private static AudioClip CreateStreamingAudioClip(string name, MP3StreamReader audioStream) { var streamBuffer = new PCMAudioBuffer(audioStream.channelCount, audioStream.bitDepth, audioStream.samplingRate, 8192); var bufferAudioClipSampleFrameCount = audioStream.samplingRate; return(AudioClip.Create(name, bufferAudioClipSampleFrameCount, audioStream.channelCount, audioStream.samplingRate, true, delegate(float[] samples) { var samplesReturned = FillUnityStreamBuffer(samples, streamBuffer, audioStream); if (audioStream.isOpen && audioStream.isDoneStreaming) { audioStream.Close(); } })); }