コード例 #1
0
ファイル: AudioData.cs プロジェクト: cruuud/GotaSoundIO
        /// <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);
            }
        }
コード例 #2
0
ファイル: AudioData.cs プロジェクト: cruuud/GotaSoundIO
        /// <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);
            }
        }
コード例 #3
0
ファイル: AudioData.cs プロジェクト: cruuud/GotaSoundIO
        /// <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);
                }
            }
        }