public override bool load() { float[] readSampleBuffer = new float[AudioBuffer.MAX_BUFFER_SIZE]; short[] convBuffer = new short[AudioBuffer.MAX_BUFFER_SIZE]; myState = SourceState.LOADING; using (myReader = new VorbisReader(myFilename)) { myNumChannels = myReader.Channels; mySampleRate = myReader.SampleRate; long sampleCount = myReader.TotalSamples * myNumChannels; int numBuffers = (int)Math.Ceiling((double)sampleCount / (double)AudioBuffer.MAX_BUFFER_SIZE); for (int i = 0; i < numBuffers; i++) { AudioBuffer buffer = new AudioBuffer(myNumChannels == 1 ? AudioBuffer.AudioFormat.MONO16 : AudioBuffer.AudioFormat.STEREO16, mySampleRate); int samplesRead = myReader.ReadSamples(readSampleBuffer, 0, AudioBuffer.MAX_BUFFER_SIZE); buffer.size = samplesRead; castBuffer(readSampleBuffer, buffer.data, samplesRead); //put it in the audio system buffer.buffer(); myBuffers.Add(buffer); } myState = Source.SourceState.LOADED; Debug.print("Loaded audio file: {0}", myFilename); } return(true); }
public override bool load() { if (File.Exists(myFilename) == false) { Warn.print("Cannot find file {0}", myFilename); myState = SourceState.FAILED; return(false); } using (FileStream waveFileStream = File.Open(myFilename, System.IO.FileMode.Open)) { BinaryReader reader = new BinaryReader(waveFileStream); int chunkID = reader.ReadInt32(); if (chunkID != 0x46464952) { Warn.print("{0} is not a RIFF formated file", myFilename); myState = SourceState.FAILED; return(false); } int fileSize = reader.ReadInt32(); int riffType = reader.ReadInt32(); if (riffType != 0x45564157) //"WAVE" in bytes { Warn.print("{0} is not a WAV", myFilename); myState = SourceState.FAILED; return(false); } int fmtID = reader.ReadInt32(); if (fmtID != 0x20746d66) //"fmt " in bytes { Warn.print("Cannot find valid fmt chunk in {0}", myFilename); myState = SourceState.FAILED; return(false); } int fmtSize = reader.ReadInt32(); if (fmtSize != 16) { Warn.print("{0} is not in 16 bit format", myFilename); myState = SourceState.FAILED; return(false); } int fmtCode = reader.ReadInt16(); if (fmtCode != 1) //PCM data { Warn.print("{0} is not in PCM format", myFilename); myState = SourceState.FAILED; return(false); } myNumChannels = reader.ReadInt16(); if (myIs3d == true && myNumChannels != 1) { Error.print("Unable to load stereo files for 3D capability"); myState = SourceState.FAILED; return(false); } mySampleRate = reader.ReadInt32(); int fmtAvgBPS = reader.ReadInt32(); int fmtBlockAlign = reader.ReadInt16(); int bitDepth = reader.ReadInt16(); if (fmtSize == 18) { // Read any extra values int fmtExtraSize = reader.ReadInt16(); reader.ReadBytes(fmtExtraSize); } int dataID = reader.ReadInt32(); if (dataID != 0x61746164) //"data" in bytes { Warn.print("Cannot find valid data chunk in file {0}", myFilename); myState = SourceState.FAILED; return(false); } int dataSize = reader.ReadInt32(); if (bitDepth != 16) { Warn.print("WAV files must be 16-bit PCM format"); myState = SourceState.FAILED; return(false); } //read the data byte[] data; data = reader.ReadBytes(dataSize); //convert to shorts short[] audioData = new short[dataSize / 2]; for (int i = 0; i < dataSize / 2; i++) { audioData[i] = BitConverter.ToInt16(data, i * 2); } AudioBuffer buffer = new AudioBuffer(myNumChannels == 1 ? AudioBuffer.AudioFormat.MONO16 : AudioBuffer.AudioFormat.STEREO16, mySampleRate); buffer.setData(audioData); //put it in the audio system buffer.buffer(); myBuffers.Add(buffer); } myState = Source.SourceState.LOADED; Info.print("Loaded audio file: {0}", myFilename); return(true); }