Convert 2 Alaw streams to 1 stereo wav file

I have 2 streams that I am trying to convert to a stereo wav file. The result does not sound good, I hear the content, but there is an annoying sound that does not exist in the source files.

The code I am doing is:

For the wav header:

   public static byte[] GetHeader(int fileLength, int bitsPerSample, int numberOfChannels, int sampleRate) // bitsPerSample = 8, numberOfChannels= 1 or 2 (mono or stereo) , sampleRate = 8000
        {
            MemoryStream memStream = new MemoryStream(WAVE_HEADER_SIZE);
            BinaryWriter writer = new BinaryWriter(memStream);
            writer.Write(Encoding.ASCII.GetBytes("RIFF"), 0, 4); //4 bytes of RIFF description
            writer.Write((fileLength  - 8) / 2);
            writer.Write(Encoding.ASCII.GetBytes("WAVE"), 0, 4);
            writer.Write(Encoding.ASCII.GetBytes("fmt "), 0, 4);
            writer.Write(16); //Chunk size 
            writer.Write((short)6); //wFormatTag (1 == uncompressed PCM, 6 = A law compression)
            writer.Write((short)numberOfChannels); //nChannels
            writer.Write(sampleRate); //nSamplesPerSec
            int blockAllign = bitsPerSample / 8 * numberOfChannels;
            writer.Write(sampleRate * blockAllign); //nAvgBytesPerSec
            writer.Write((short)blockAllign); //nBlockAlign
            writer.Write((short)bitsPerSample); //wBitsPerSample
            writer.Write(Encoding.ASCII.GetBytes("data"), 0, 4);
            writer.Write(fileLength / 2 - WAVE_HEADER_SIZE); //data length 
            writer.Flush();

            byte[] buffer = new byte[memStream.Length];
            memStream.Position = 0;
            memStream.Read(buffer, 0, buffer.Length);

            writer.Close();
            return buffer;
        }

Data (source streams are read from alaw files):

                do
                {
                    if (channels == 2)
                    {
                        if (dlRead == 0)
                        {
                            dlRead = dlStream.Read (dlBuffer, 0, dlBuffer.Length);

                        }
                        if (ulRead == 0)
                        {
                            ulRead =ulStream.Read (ulBuffer, 0, ulBuffer.Length);
                        }

                        if ((dlRead != 0) && (ulRead != 0))
                        {
                            //Create the stero wave buffer
                            Array.Clear(waveBuffer, 0, waveBuffer.Length);
                            for (int i = 0; i < dlRead / 2; ++i)
                            {
                                waveBuffer[i * 4 + 0] = dlBuffer[i * 2];
                                waveBuffer[i * 4 + 1] = dlBuffer[i * 2 + 1];
                            }
                            for (int i = 0; i < ulRead / 2; ++i)
                            {
                                waveBuffer[i * 4 + 2] = ulBuffer[i * 2];
                                waveBuffer[i * 4 + 3] = ulBuffer[i * 2 + 1];
                            }
                            bytesToWrite = Math.Max(ulRead * 2, dlRead * 2);
                            dlRead = 0;
                            ulRead = 0;
                        }
                        else
                            bytesToWrite = 0;
                    }
                    else
                    {
                        //Create the mono wave buffer
                        if (metadata.ULExists)
                        {
                            bytesToWrite = ulStream.Read(ulBuffer, 0, ulBuffer.Length);
                            Buffer.BlockCopy(ulBuffer, 0, waveBuffer, 0, ulBuffer.Length);

                        }
                        else if (metadata.DLExists)
                        {
                            bytesToWrite = dlStream.Read(dlBuffer, 0, dlBuffer.Length);
                            Buffer.BlockCopy(dlBuffer, 0, waveBuffer, 0, dlBuffer.Length);

                        }
                        else
                        {
                            bytesToWrite = 0;
                        }
                    }

                    if (bytesToWrite > 0)
                        fileStream.Write(waveBuffer, 0, bytesToWrite);
                } while (bytesToWrite > 0);

What am I doing wrong? Any ideas?

+4
source share

All Articles