private void WriteSuffixDiin(Stream outStream) { var diinSource = GetChunkById(DsdChunk.IdType.DIIN); if (diinSource != null) { // Write DIIN var diinChunk = new DsdChunksContainer(DsdChunk.IdType.DIIN); // > MARK property // Ignore at this moment // > DIAR property if (!string.IsNullOrEmpty(diinSource.ArtistText)) { if ((diinSource.ArtistText.Length % 2) != 0) { diinSource.ArtistText += " "; } var diarChunk = new DsdChunksContainer(DsdChunk.DiinChunk.DIAR); diarChunk.WriteInt32(diinSource.ArtistText.TrimEnd().Length); diarChunk.WriteIdString(diinSource.ArtistText, diinSource.ArtistText.Length); diinChunk.WriteChunk(diarChunk); } // > DITI property if (!string.IsNullOrEmpty(diinSource.TitleText)) { if ((diinSource.TitleText.Length % 2) != 0) { diinSource.TitleText += " "; } var ditiChunk = new DsdChunksContainer(DsdChunk.DiinChunk.DITI); ditiChunk.WriteInt32(diinSource.TitleText.TrimEnd().Length); ditiChunk.WriteIdString(diinSource.TitleText, diinSource.TitleText.Length); diinChunk.WriteChunk(ditiChunk); } // > EMID property if (!string.IsNullOrEmpty(diinSource.EMId)) { Console.WriteLine("EMID: " + diinSource.EMId + ", length: " + diinSource.EMId.Length); Console.WriteLine("\n\n"); var emidChunk = new DsdChunksContainer(DsdChunk.DiinChunk.EMID); emidChunk.WriteIdString(diinSource.EMId, diinSource.EMId.Length); diinChunk.WriteChunk(emidChunk); } diinChunk.FlushToStream(outStream); } }
private void WriteHeader() { // DSDIFF signature DsdChunksContainer.WriteId(_outStream, DsdChunk.IdType.FRM8); DsdChunksContainer.WriteInt64(_outStream, 0); // Will write correct data size later DsdChunksContainer.WriteId(_outStream, DsdChunk.IdType.DSD); // File version DsdChunksContainer.WriteId(_outStream, DsdChunk.IdType.FVER); DsdChunksContainer.WriteInt64(_outStream, 4); DsdChunksContainer.WriteUInt32(_outStream, 0x01050000); // Properties composed chunk var propChunk = new DsdChunksContainer(DsdChunk.IdType.PROP); propChunk.WriteId(DsdChunk.IdType.SND); // > FS - frequency var fsChunk = new DsdChunksContainer(DsdChunk.PropChunk.FS); fsChunk.WriteUInt32(2822400); // > CHNL - channels var chnlChunk = new DsdChunksContainer(DsdChunk.PropChunk.CHNL); chnlChunk.WriteUInt16(_channelsCount); var chnlId = new[] { "SLFT", "SRGT", "MLFT", "MRGT", "LS", "RS", "C", "LFE", "C000", "C001", "C002", "C003", "C004", "C005", "C006", "C007", "C008", "C009" }; for (var n = 0; n < _channelsCount; n++) { chnlChunk.WriteIdString(chnlId[n]); } // > CMPR - compression var cmprChunk = new DsdChunksContainer(DsdChunk.PropChunk.CMPR); cmprChunk.WriteIdString("DSD"); const string compressorName = "not compressed "; cmprChunk.WriteUInt8((byte)compressorName.Length); cmprChunk.WriteIdString(compressorName); // > ABSS - absolute start time chunk var abssChunk = new DsdChunksContainer(DsdChunk.PropChunk.ABSS); abssChunk.WriteUInt16(0); abssChunk.WriteUInt8(0); abssChunk.WriteUInt8(0); abssChunk.WriteUInt32(0); // > LSCO - loudspeaker configuration var lscoChunk = new DsdChunksContainer(DsdChunk.PropChunk.LSCO); lscoChunk.WriteUInt16((ushort)(_channelsCount <= 2 ? 0 : 4)); // << Write all property chunks info container propChunk.WriteChunk(fsChunk); propChunk.WriteChunk(chnlChunk); propChunk.WriteChunk(cmprChunk); //propChunk.WriteChunk(abssChunk); propChunk.WriteChunk(lscoChunk); // Write property chunk info the file propChunk.FlushToStream(_outStream); // Begin DSD section DsdChunksContainer.WriteId(_outStream, DsdChunk.IdType.DSD); _dsdLengthPosition = _outStream.Position; DsdChunksContainer.WriteInt64(_outStream, 0); }