Ejemplo n.º 1
0
    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));
    }
Ejemplo n.º 2
0
    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);
    }