/// <summary> /// Read blocked data. /// </summary> /// <param name="r">The reader.</param> /// <param name="encodingType">Encoding type.</param> /// <param name="numChannels">Number of channels to read.</param> /// <param name="numBlocks">Number of blocks to read.</param> /// <param name="blockSize">Size of each block.</param> /// <param name="blockSamples">Samples in each block.</param> /// <param name="lastBlockSize">Last block size.</param> /// <param name="lastBlockSamples">Last block samples.</param> /// <param name="lastBlockPaddingSize">Size of the padding following the last block.</param> public void Read(FileReader r, Type encodingType, int numChannels, uint numBlocks, uint blockSize, uint blockSamples, uint lastBlockSize, uint lastBlockSamples, uint lastBlockPaddingSize) { //Set properties. EncodingType = encodingType; BlockSize = (int)blockSize; BlockSamples = (int)blockSamples; LastBlockPaddingSize = (int)lastBlockPaddingSize; //Init channels. Channels.Clear(); for (int i = 0; i < numChannels; i++) { Channels.Add(new List <IAudioEncoding>()); } //Read standard blocks. for (uint i = 0; i < numBlocks - 1; i++) { for (int j = 0; j < numChannels; j++) { IAudioEncoding data = (IAudioEncoding)Activator.CreateInstance(EncodingType); data.ReadRaw(r, blockSamples, blockSize); Channels[j].Add(data); } } //Read last block. for (int i = 0; i < numChannels; i++) { IAudioEncoding data = (IAudioEncoding)Activator.CreateInstance(EncodingType); data.ReadRaw(r, lastBlockSamples, lastBlockSize); Channels[i].Add(data); r.ReadBytes(LastBlockPaddingSize); } }
/// <summary> /// Read unblocked data. /// </summary> /// <param name="r">The reader.</param> /// <param name="encodingType">Encoding type.</param> /// <param name="numChannels">Number of channels to read.</param> /// <param name="dataSize">Data size of each channel.</param> /// <param name="numSamples">Number of samples to read.</param> /// <param name="dataPadding">Padding between one channel's data and the next.</param> public void Read(FileReader r, Type encodingType, int numChannels, int dataSize, int numSamples, int dataPadding) { //Set properties. EncodingType = encodingType; BlockSize = -1; BlockSamples = -1; LastBlockPaddingSize = dataPadding; //Read channel data. Channels.Clear(); for (int i = 0; i < numChannels; i++) { Channels.Add(new List <IAudioEncoding>()); IAudioEncoding data = (IAudioEncoding)Activator.CreateInstance(EncodingType); data.ReadRaw(r, (uint)numSamples, (uint)dataSize); Channels.Last().Add(data); r.ReadBytes(dataPadding); } }
/// <summary> /// Convert audio data to another encoding. /// </summary> /// <param name="targetEncoding">Target encoding.</param> /// <param name="targetBlockSize">Target block size.</param> /// <param name="loopStart">Loop start position.</param> /// <param name="loopEnd">Loop end position.</param> public void Convert(Type targetEncoding, int targetBlockSize, int loopStart = -1, int loopEnd = -1) { //Encoding type. EncodingType = targetEncoding; //For each channel. for (int i = 0; i < Channels.Count; i++) { //Decoding data. object decodingData = null; //Get samples. List <float> samples = new List <float>(); foreach (var b in Channels[i]) { samples.AddRange(b.ToFloatPCM(decodingData)); } var s = samples.ToArray(); //Clear blocks. Channels[i].Clear(); //Temporary block. IAudioEncoding tmp = (IAudioEncoding)Activator.CreateInstance(targetEncoding); //No block size. if (targetBlockSize == -1) { BlockSize = BlockSamples = -1; tmp.FromFloatPCM(s, null, loopStart, loopEnd); Channels[i].Add(tmp); continue; } //Encoding data. object encodingData = null; //Get samples per block. BlockSize = targetBlockSize; int samplesPerBlock = tmp.SamplesFromBlockSize(targetBlockSize); BlockSamples = samplesPerBlock; int numBlocks = samples.Count / samplesPerBlock; if (samples.Count % samplesPerBlock != 0) { numBlocks++; } for (int j = 0; j < numBlocks; j++) { int numSamples = (j == numBlocks - 1) ? (samples.Count % samplesPerBlock) : samplesPerBlock; if (numSamples == 0) { numSamples = samplesPerBlock; } int lS = -1, lE = -1; if (loopStart != -1) { if (loopStart >= samplesPerBlock * j && loopStart < samplesPerBlock * j + numSamples) { lS = loopStart - samplesPerBlock * j; } } if (loopEnd != -1) { if (loopEnd >= samplesPerBlock * j && loopEnd < samplesPerBlock * j + numSamples) { lE = loopEnd - samplesPerBlock * j; } } IAudioEncoding block = (IAudioEncoding)Activator.CreateInstance(targetEncoding); block.FromFloatPCM(s.SubArray(j * samplesPerBlock, numSamples), encodingData, lS, lE); Channels[i].Add(block); } } }