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) { PCMAudioBuffer streamBuffer = new PCMAudioBuffer(audioStream.channelCount, audioStream.bitDepth, audioStream.samplingRate, 8192); int bufferAudioClipSampleFrameCount = audioStream.samplingRate; return(AudioClip.Create(name, bufferAudioClipSampleFrameCount, audioStream.channelCount, audioStream.samplingRate, true, delegate(float[] samples) { int samplesReturned = FillUnityStreamBuffer(samples, streamBuffer, audioStream); if (audioStream.isOpen && audioStream.isDoneStreaming) { audioStream.Close(); } })); }
/// <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); } int totalSampleFramesToRead = unityBuffer.Length / audioStream.channelCount; int sampleFramesRead = 0; while (sampleFramesRead < totalSampleFramesToRead) { // Read some sample frames. int sampleFramesLeftToRead = totalSampleFramesToRead - sampleFramesRead; int 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. int samplesRead = sampleFramesRead * audioStream.channelCount; Array.Clear(unityBuffer, samplesRead, unityBuffer.Length - samplesRead); break; } } return(sampleFramesRead * audioStream.channelCount); }
public static GameObject Play2DAudioClip(PCMAudioBuffer audioBuffer) { var audioClip = CreateAudioClip("tmp2DAudioClip", audioBuffer); return(Play2DAudioClip(audioClip)); }
void Start() { streamBuffer = new PCMAudioBuffer(audioStream.channelCount, audioStream.bitDepth, audioStream.samplingRate, 8192); UnitySampleRate = AudioSettings.outputSampleRate; }