private static byte[] ConvertRawPCMFile(int outputSampleRate, int outputChannels, byte[] pcmSamples, PcmSample pcmSampleSize, int pcmSampleRate, int pcmChannels) { int numPcmSamples = (pcmSamples.Length / (int)pcmSampleSize / pcmChannels); float pcmDuraton = numPcmSamples / (float)pcmSampleRate; int numOutputSamples = (int)(pcmDuraton * outputSampleRate); //Ensure that samble buffer is aligned to write chunk size numOutputSamples = (numOutputSamples / WriteBufferSize) * WriteBufferSize; float[][] outSamples = new float[outputChannels][]; for (int ch = 0; ch < outputChannels; ch++) { outSamples[ch] = new float[numOutputSamples]; } for (int sampleNumber = 0; sampleNumber < numOutputSamples; sampleNumber++) { float rawSample = 0.0f; for (int ch = 0; ch < outputChannels; ch++) { int sampleIndex = (sampleNumber * pcmChannels) * (int)pcmSampleSize; if (ch < pcmChannels) { sampleIndex += (ch * (int)pcmSampleSize); } switch (pcmSampleSize) { case PcmSample.EightBit: rawSample = ByteToSample(pcmSamples[sampleIndex]); break; case PcmSample.SixteenBit: rawSample = ShortToSample((short)(pcmSamples[sampleIndex + 1] << 8 | pcmSamples[sampleIndex])); break; } outSamples[ch][sampleNumber] = rawSample; } } return(GenerateFile(outSamples, outputSampleRate, outputChannels)); }
private static void ConvertPCMToOggVorbis(Stream inputStream, Stream outputStream, int outputSampleRate, int outputChannels, PcmSample pcmSampleSize, int pcmSampleRate, int pcmChannels) { byte[] pcm = new byte[WriteBufferSize]; InitOggStream(outputSampleRate, outputChannels, out OggStream oggStream, out ProcessingState processingState); while (true) { int chunkSize = inputStream.Read(pcm, 0, WriteBufferSize); if (chunkSize <= 0) { break; } int numPcmSamples = chunkSize / (int)pcmSampleSize / pcmChannels; float pcmDuraton = numPcmSamples / (float)pcmSampleRate; int numOutputSamples = (int)(pcmDuraton * outputSampleRate); float[][] outSamples = new float[outputChannels][]; for (int ch = 0; ch < outputChannels; ch++) { outSamples[ch] = new float[numOutputSamples]; } for (int sampleNumber = 0; sampleNumber < numOutputSamples; sampleNumber++) { float rawSample = 0.0f; for (int ch = 0; ch < outputChannels; ch++) { int sampleIndex = (sampleNumber * pcmChannels) * (int)pcmSampleSize; if (ch < pcmChannels) { sampleIndex += ch * (int)pcmSampleSize; } switch (pcmSampleSize) { case PcmSample.EightBit: rawSample = ByteToSample(pcm[sampleIndex]); break; default: case PcmSample.SixteenBit: rawSample = ShortToSample((short)(pcm[sampleIndex + 1] << 8 | pcm[sampleIndex])); break; } outSamples[ch][sampleNumber] = rawSample; } } FlushPages(oggStream, outputStream, false); ProcessChunk(outSamples, processingState, oggStream, numOutputSamples); } FlushPages(oggStream, outputStream, true); }