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;
}
}