/// /// * <param name="header"> </param> /// * <param name="fs"> </param> /// * <exception cref="IOException"> </exception> /// private FileStream newHeader(string header, FileInfo f, bool bClose) { try { FileStream fs = new FileStream(f.FullName, FileMode.Create); if (header != null) { //fs.write(header.getBytes()); SupportClass.WriteOutput(fs, Encoding.Default.GetBytes(header)); //fs.write("\n------ end of header ----!\n".getBytes()); SupportClass.WriteOutput(fs, Encoding.Default.GetBytes("\n------ end of header ----!\n")); if (bClose) { fs.Flush(); fs.Close(); } } return(fs); } catch (FileNotFoundException) { // nop } catch (IOException) { // nop } return(null); }
public static void Main(System.String[] args) { ChunkHeader FormatChunkHeader = new ChunkHeader(); ChunkHeader DataChunkHeader = new ChunkHeader(); RiffChunkHeader myRiffChunkHeader = new RiffChunkHeader(); WaveHeader WaveHeader = new WaveHeader(); sbyte[] myRiffChunkHeaderAsByteArray = new sbyte[12]; sbyte[] myFormatChunkHeaderAsByteArray = new sbyte[8]; sbyte[] myWaveHeaderAsByteArray = new sbyte[16]; sbyte[] myDataChunkHeaderAsByteArray = new sbyte[8]; long total_unpacked_samples = 0, total_samples; // was uint32_t in C int num_channels, bps; WavpackContext wpc = new WavpackContext(); System.IO.FileStream fistream; System.IO.FileStream fostream; System.IO.BinaryReader in_Renamed; long start, end; System.String inputWVFile; if (args.Length == 0) { inputWVFile = "input.wv"; } else { inputWVFile = args[0]; } try { fistream = new System.IO.FileStream(inputWVFile, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.IO.BufferedStream bstream = new System.IO.BufferedStream(fistream, 16384); in_Renamed = new System.IO.BinaryReader(bstream); wpc = WavPackUtils.WavpackOpenFileInput(in_Renamed); } catch (System.IO.FileNotFoundException) { System.Console.Error.WriteLine("Input file not found"); System.Environment.Exit(1); } catch (System.IO.DirectoryNotFoundException) { System.Console.Error.WriteLine("Input file not found - invalid directory"); System.Environment.Exit(1); } if (wpc.error) { System.Console.Error.WriteLine("Sorry an error has occured"); System.Console.Error.WriteLine(wpc.error_message); System.Environment.Exit(1); } num_channels = WavPackUtils.WavpackGetReducedChannels(wpc); System.Console.Out.WriteLine("The WavPack file has " + num_channels + " channels"); total_samples = WavPackUtils.WavpackGetNumSamples(wpc); System.Console.Out.WriteLine("The WavPack file has " + total_samples + " samples"); bps = WavPackUtils.WavpackGetBytesPerSample(wpc); System.Console.Out.WriteLine("The WavPack file has " + bps + " bytes per sample"); myRiffChunkHeader.ckID[0] = 'R'; myRiffChunkHeader.ckID[1] = 'I'; myRiffChunkHeader.ckID[2] = 'F'; myRiffChunkHeader.ckID[3] = 'F'; myRiffChunkHeader.ckSize = total_samples * num_channels * bps + 8 * 2 + 16 + 4; myRiffChunkHeader.formType[0] = 'W'; myRiffChunkHeader.formType[1] = 'A'; myRiffChunkHeader.formType[2] = 'V'; myRiffChunkHeader.formType[3] = 'E'; FormatChunkHeader.ckID[0] = 'f'; FormatChunkHeader.ckID[1] = 'm'; FormatChunkHeader.ckID[2] = 't'; FormatChunkHeader.ckID[3] = ' '; FormatChunkHeader.ckSize = 16; WaveHeader.FormatTag = 1; WaveHeader.NumChannels = num_channels; WaveHeader.SampleRate = WavPackUtils.WavpackGetSampleRate(wpc); WaveHeader.BlockAlign = num_channels * bps; WaveHeader.BytesPerSecond = WaveHeader.SampleRate * WaveHeader.BlockAlign; WaveHeader.BitsPerSample = WavPackUtils.WavpackGetBitsPerSample(wpc); DataChunkHeader.ckID[0] = 'd'; DataChunkHeader.ckID[1] = 'a'; DataChunkHeader.ckID[2] = 't'; DataChunkHeader.ckID[3] = 'a'; DataChunkHeader.ckSize = total_samples * num_channels * bps; myRiffChunkHeaderAsByteArray[0] = (sbyte)myRiffChunkHeader.ckID[0]; myRiffChunkHeaderAsByteArray[1] = (sbyte)myRiffChunkHeader.ckID[1]; myRiffChunkHeaderAsByteArray[2] = (sbyte)myRiffChunkHeader.ckID[2]; myRiffChunkHeaderAsByteArray[3] = (sbyte)myRiffChunkHeader.ckID[3]; // swap endians here myRiffChunkHeaderAsByteArray[7] = (sbyte)(SupportClass.URShift(myRiffChunkHeader.ckSize, 24)); myRiffChunkHeaderAsByteArray[6] = (sbyte)(SupportClass.URShift(myRiffChunkHeader.ckSize, 16)); myRiffChunkHeaderAsByteArray[5] = (sbyte)(SupportClass.URShift(myRiffChunkHeader.ckSize, 8)); myRiffChunkHeaderAsByteArray[4] = (sbyte)(myRiffChunkHeader.ckSize); myRiffChunkHeaderAsByteArray[8] = (sbyte)myRiffChunkHeader.formType[0]; myRiffChunkHeaderAsByteArray[9] = (sbyte)myRiffChunkHeader.formType[1]; myRiffChunkHeaderAsByteArray[10] = (sbyte)myRiffChunkHeader.formType[2]; myRiffChunkHeaderAsByteArray[11] = (sbyte)myRiffChunkHeader.formType[3]; myFormatChunkHeaderAsByteArray[0] = (sbyte)FormatChunkHeader.ckID[0]; myFormatChunkHeaderAsByteArray[1] = (sbyte)FormatChunkHeader.ckID[1]; myFormatChunkHeaderAsByteArray[2] = (sbyte)FormatChunkHeader.ckID[2]; myFormatChunkHeaderAsByteArray[3] = (sbyte)FormatChunkHeader.ckID[3]; // swap endians here myFormatChunkHeaderAsByteArray[7] = (sbyte)(SupportClass.URShift(FormatChunkHeader.ckSize, 24)); myFormatChunkHeaderAsByteArray[6] = (sbyte)(SupportClass.URShift(FormatChunkHeader.ckSize, 16)); myFormatChunkHeaderAsByteArray[5] = (sbyte)(SupportClass.URShift(FormatChunkHeader.ckSize, 8)); myFormatChunkHeaderAsByteArray[4] = (sbyte)(FormatChunkHeader.ckSize); // swap endians myWaveHeaderAsByteArray[1] = (sbyte)(SupportClass.URShift(WaveHeader.FormatTag, 8)); myWaveHeaderAsByteArray[0] = (sbyte)(WaveHeader.FormatTag); // swap endians myWaveHeaderAsByteArray[3] = (sbyte)(SupportClass.URShift(WaveHeader.NumChannels, 8)); myWaveHeaderAsByteArray[2] = (sbyte)WaveHeader.NumChannels; // swap endians myWaveHeaderAsByteArray[7] = (sbyte)(SupportClass.URShift(WaveHeader.SampleRate, 24)); myWaveHeaderAsByteArray[6] = (sbyte)(SupportClass.URShift(WaveHeader.SampleRate, 16)); myWaveHeaderAsByteArray[5] = (sbyte)(SupportClass.URShift(WaveHeader.SampleRate, 8)); myWaveHeaderAsByteArray[4] = (sbyte)(WaveHeader.SampleRate); // swap endians myWaveHeaderAsByteArray[11] = (sbyte)(SupportClass.URShift(WaveHeader.BytesPerSecond, 24)); myWaveHeaderAsByteArray[10] = (sbyte)(SupportClass.URShift(WaveHeader.BytesPerSecond, 16)); myWaveHeaderAsByteArray[9] = (sbyte)(SupportClass.URShift(WaveHeader.BytesPerSecond, 8)); myWaveHeaderAsByteArray[8] = (sbyte)(WaveHeader.BytesPerSecond); // swap endians myWaveHeaderAsByteArray[13] = (sbyte)(SupportClass.URShift(WaveHeader.BlockAlign, 8)); myWaveHeaderAsByteArray[12] = (sbyte)WaveHeader.BlockAlign; // swap endians myWaveHeaderAsByteArray[15] = (sbyte)(SupportClass.URShift(WaveHeader.BitsPerSample, 8)); myWaveHeaderAsByteArray[14] = (sbyte)WaveHeader.BitsPerSample; myDataChunkHeaderAsByteArray[0] = (sbyte)DataChunkHeader.ckID[0]; myDataChunkHeaderAsByteArray[1] = (sbyte)DataChunkHeader.ckID[1]; myDataChunkHeaderAsByteArray[2] = (sbyte)DataChunkHeader.ckID[2]; myDataChunkHeaderAsByteArray[3] = (sbyte)DataChunkHeader.ckID[3]; // swap endians myDataChunkHeaderAsByteArray[7] = (sbyte)(SupportClass.URShift(DataChunkHeader.ckSize, 24)); myDataChunkHeaderAsByteArray[6] = (sbyte)(SupportClass.URShift(DataChunkHeader.ckSize, 16)); myDataChunkHeaderAsByteArray[5] = (sbyte)(SupportClass.URShift(DataChunkHeader.ckSize, 8)); myDataChunkHeaderAsByteArray[4] = (sbyte)DataChunkHeader.ckSize; try { fostream = new System.IO.FileStream("output.wav", System.IO.FileMode.Create); SupportClass.WriteOutput(fostream, myRiffChunkHeaderAsByteArray); SupportClass.WriteOutput(fostream, myFormatChunkHeaderAsByteArray); SupportClass.WriteOutput(fostream, myWaveHeaderAsByteArray); SupportClass.WriteOutput(fostream, myDataChunkHeaderAsByteArray); start = (System.DateTime.Now.Ticks - 621355968000000000) / 10000; while (true) { long samples_unpacked; // was uint32_t in C samples_unpacked = WavPackUtils.WavpackUnpackSamples(wpc, temp_buffer, Defines.SAMPLE_BUFFER_SIZE / num_channels); total_unpacked_samples += samples_unpacked; if (samples_unpacked > 0) { samples_unpacked = samples_unpacked * num_channels; pcm_buffer = format_samples(bps, temp_buffer, samples_unpacked); fostream.Write(pcm_buffer, 0, (int)samples_unpacked * bps); } if (samples_unpacked == 0) { break; } } // end of while end = (System.DateTime.Now.Ticks - 621355968000000000) / 10000; System.Console.Out.WriteLine(end - start + " milli seconds to process WavPack file in main loop"); } catch (System.Exception e) { System.Console.Error.WriteLine("Error when writing wav file, sorry: "); SupportClass.WriteStackTrace(e, Console.Error); System.Environment.Exit(1); } if ((WavPackUtils.WavpackGetNumSamples(wpc) != -1) && (total_unpacked_samples != WavPackUtils.WavpackGetNumSamples(wpc))) { System.Console.Error.WriteLine("Incorrect number of samples"); System.Environment.Exit(1); } if (WavPackUtils.WavpackGetNumErrors(wpc) > 0) { System.Console.Error.WriteLine("CRC errors detected"); System.Environment.Exit(1); } System.Environment.Exit(0); }