NAudio.Wave.CueList.GetRIFFChunks C# (CSharp) Method

GetRIFFChunks() private method

Gets the cues as the concatenated cue and list RIFF chunks.
private GetRIFFChunks ( ) : byte[]
return byte[]
        internal byte[] GetRIFFChunks()
        {
            if (this.Count == 0)
            {
                return null;
            }
            else
            {
                int cueChunkLength = 12 + 24 * this.Count;
                int listChunkLength = 12;
                int labelChunkLength = 0;
                for (int i = 0; i < this.Count; i++)
                {
                    labelChunkLength = this[i].Label.Length + 1;
                    listChunkLength += labelChunkLength + labelChunkLength % 2 + 12;
                }

                byte[] chunks = new byte[cueChunkLength + listChunkLength];
                Int32 cueChunkID = ChunkIdentifier.ChunkIdentifierToInt32("cue ");
                Int32 dataChunkID = ChunkIdentifier.ChunkIdentifierToInt32("data");
                Int32 listChunkID = ChunkIdentifier.ChunkIdentifierToInt32("LIST");
                Int32 adtlTypeID = ChunkIdentifier.ChunkIdentifierToInt32("adtl");
                Int32 labelChunkID = ChunkIdentifier.ChunkIdentifierToInt32("labl");

                using (MemoryStream stream = new MemoryStream(chunks))
                {
                    using (BinaryWriter writer = new BinaryWriter(stream))
                    {
                        writer.Write(cueChunkID);
                        writer.Write(cueChunkLength - 8);
                        writer.Write(this.Count);
                        for (int cue = 0; cue < this.Count; cue++)
                        {
                            writer.Write(cue);
                            writer.Seek(4, SeekOrigin.Current);
                            writer.Write(dataChunkID);
                            writer.Seek(8, SeekOrigin.Current);
                            writer.Write(this[cue].Position);
                        }
                        writer.Write(listChunkID);
                        writer.Write(listChunkLength - 8);
                        writer.Write(adtlTypeID);
                        for (int cue = 0; cue < this.Count; cue++)
                        {
                            writer.Write(labelChunkID);
                            writer.Write(this[cue].Label.Length + 1 + 4);
                            writer.Write(cue);
                            writer.Write(Encoding.Default.GetBytes(this[cue].Label.ToCharArray()));
                            if (this[cue].Label.Length % 2 == 0)
                            {
                                writer.Seek(2, SeekOrigin.Current);
                            }
                            else
                            {
                                writer.Seek(1, SeekOrigin.Current);
                            }
                        }
                    }
                }
                return chunks;
            }
        }

Usage Example

 private void WriteCues(BinaryWriter w)
 {
     // write the cue chunks to the end of the stream
     if (cues != null)
     {
         byte[] cueChunks     = cues.GetRIFFChunks();
         int    cueChunksSize = cueChunks.Length;
         w.Seek(0, SeekOrigin.End);
         w.Write(cues.GetRIFFChunks(), 0, cueChunksSize);
         w.Seek(4, SeekOrigin.Begin);
         w.Write((int)(w.BaseStream.Length - 8));
     }
 }