private void InitializeHeader() { try { lock (_randomAccessLock) { _randomAccessWriter = new RandomAccessFile(_filePath, "rw"); _randomAccessWriter.SetLength(0); // Set file length to 0, to prevent unexpected behavior in case the file already existed _randomAccessWriter.WriteBytes("RIFF"); _randomAccessWriter.WriteInt(0); // Final file size not known yet, write 0 _randomAccessWriter.WriteBytes("WAVE"); _randomAccessWriter.WriteBytes("fmt "); _randomAccessWriter.WriteInt(Integer.ReverseBytes(16)); // Sub-chunk size, 16 for PCM _randomAccessWriter.WriteShort(Short.ReverseBytes(1)); // AudioFormat, 1 for PCM _randomAccessWriter.WriteShort(Short.ReverseBytes(Channels)); // Number of channels, 1 for mono, 2 for stereo _randomAccessWriter.WriteInt(Integer.ReverseBytes(_sampleRate)); // Sample rate _randomAccessWriter.WriteInt(Integer.ReverseBytes(_sampleRate * FmtAvgBps * Channels / 8)); // Byte rate, SampleRate*NumberOfChannels*BitsPerSample/8 _randomAccessWriter.WriteShort(Short.ReverseBytes(Channels * FmtAvgBps / 8)); // Block align, NumberOfChannels*BitsPerSample/8 _randomAccessWriter.WriteShort(Short.ReverseBytes(FmtAvgBps)); // Bits per sample _randomAccessWriter.WriteBytes("data"); _randomAccessWriter.WriteInt(0); // Data chunk size not known yet, write 0 } } catch (NullReferenceException e) { Log.Debug(Tag, e.Message + e.StackTrace); State = WavRecorderState.Error; } }