本文整理汇总了C#中IAudioStream.ReadSamples方法的典型用法代码示例。如果您正苦于以下问题:C# IAudioStream.ReadSamples方法的具体用法?C# IAudioStream.ReadSamples怎么用?C# IAudioStream.ReadSamples使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IAudioStream
的用法示例。
在下文中一共展示了IAudioStream.ReadSamples方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Encode
//.........这里部分代码省略.........
part1->_lastBlockSamples = lbSamples;
part1->_lastBlockTotal = lbTotal;
part1->_dataInterval = 0x3800;
part1->_bitsPerSample = 4;
//Create one ADPCMInfo for each channel
int* adpcData = stackalloc int[channels];
ADPCMInfo** pAdpcm = (ADPCMInfo**)adpcData;
for (int i = 0; i < channels; i++)
*(pAdpcm[i] = head->GetChannelInfo(i)) = new ADPCMInfo() { _pad = 0 };
//Create buffer for each channel
int* bufferData = stackalloc int[channels];
short** channelBuffers = (short**)bufferData;
int bufferSamples = totalSamples + 2; //Add two samples for initial yn values
for (int i = 0; i < channels; i++)
{
channelBuffers[i] = tPtr = (short*)Marshal.AllocHGlobal(bufferSamples * 2); //Two bytes per sample
//Zero padding samples and initial yn values
for (int x = 0; x < (loopPadding + 2); x++)
*tPtr++ = 0;
}
//Fill buffers
stream.SamplePosition = 0;
short* sampleBuffer = stackalloc short[channels];
for (int i = 2; i < bufferSamples; i++)
{
if (stream.SamplePosition == stream.LoopEndSample && looped)
stream.SamplePosition = stream.LoopStartSample;
stream.ReadSamples(sampleBuffer, 1);
for (int x = 0; x < channels; x++)
channelBuffers[x][i] = sampleBuffer[x];
}
//Calculate coefs
for (int i = 0; i < channels; i++)
AudioConverter.CalcCoefs(channelBuffers[i] + 2, totalSamples, (short*)pAdpcm[i], progress);
//Encode blocks
byte* dPtr = (byte*)data->Data;
bshort* pyn = (bshort*)adpc->Data;
for (int sIndex = 0, bIndex = 1; sIndex < totalSamples; sIndex += 0x3800, bIndex++)
{
int blockSamples = Math.Min(totalSamples - sIndex, 0x3800);
for (int x = 0; x < channels; x++)
{
short* sPtr = channelBuffers[x] + sIndex;
//Set block yn values
if (bIndex != blocks)
{
*pyn++ = sPtr[0x3801];
*pyn++ = sPtr[0x3800];
}
//Encode block (include yn in sPtr)
AudioConverter.EncodeBlock(sPtr, blockSamples, dPtr, (short*)pAdpcm[x]);
//Set initial ps
if (bIndex == 1)
pAdpcm[x]->_ps = *dPtr;
示例2: Encode
//.........这里部分代码省略.........
_volFrontRight = 1,
_adpcmInfoOffset = waveSize + tableSize + channelSize + i * 0x30
};
}
//Create one ADPCMInfo for each channel
int* adpcData = stackalloc int[channels];
ADPCMInfo** pAdpcm = (ADPCMInfo**)adpcData;
for (int i = 0; i < channels; i++)
*(pAdpcm[i] = wave->GetADPCMInfo(i)) = new ADPCMInfo();
//Create buffer for each channel
int* bufferData = stackalloc int[channels];
short** channelBuffers = (short**)bufferData;
int bufferSamples = totalSamples + 2; //Add two samples for initial yn values
for (int i = 0; i < channels; i++)
{
channelBuffers[i] = tPtr = (short*)Marshal.AllocHGlobal(bufferSamples * 2); //Two bytes per sample
//Zero padding samples and initial yn values
//for (int x = 0; x < (loopPadding + 2); x++)
// *tPtr++ = 0;
}
//Fill buffers
stream.SamplePosition = 0;
short* sampleBuffer = stackalloc short[channels];
for (int i = 2; i < bufferSamples; i++)
{
//if (stream.SamplePosition == stream.LoopEndSample && looped)
// stream.SamplePosition = stream.LoopStartSample;
stream.ReadSamples(sampleBuffer, 1);
for (int x = 0; x < channels; x++)
channelBuffers[x][i] = sampleBuffer[x];
}
//Calculate coefs
for (int i = 0; i < channels; i++)
AudioConverter.CalcCoefs(channelBuffers[i] + 2, totalSamples, (short*)pAdpcm[i], progress);
//Encode blocks
byte* dPtr = (byte*)wave + entrySize;
for (int sIndex = 0, bIndex = 1; sIndex < totalSamples; sIndex += samplesPerBlock, bIndex++)
{
int blockSamples = Math.Min(totalSamples - sIndex, samplesPerBlock);
for (int x = 0; x < channels; x++)
{
channelInfo[x]._channelDataOffset = (int)(dPtr - ((byte*)wave + entrySize));
short* sPtr = channelBuffers[x] + sIndex;
//Set block yn values
if (bIndex != blocks)
{
pAdpcm[x]->_yn1 = sPtr[samplesPerBlock + 1];
pAdpcm[x]->_yn2 = sPtr[samplesPerBlock];
}
//Encode block (include yn in sPtr)
AudioConverter.EncodeBlock(sPtr, blockSamples, dPtr, (short*)pAdpcm[x]);
//Set initial ps
if (bIndex == 1)
pAdpcm[x]->_ps = *dPtr;
示例3: ToFile
public static void ToFile(IAudioStream source, string path)
{
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, 8, FileOptions.SequentialScan))
{
//Estimate size
int outLen = 44 + (source.Samples * source.Channels * 2);
//Create file map
stream.SetLength(outLen);
using (FileMap map = FileMap.FromStreamInternal(stream, FileMapProtect.ReadWrite, 0, outLen))
{
RIFFHeader* riff = (RIFFHeader*)map.Address;
*riff = new RIFFHeader(1, source.Channels, 16, source.Frequency, source.Samples);
source.SamplePosition = 0;
source.ReadSamples(map.Address + 44, source.Samples);
}
}
}
示例4: Fill
public void Fill(IAudioStream stream, bool loop)
{
int blockAlign = stream.BitsPerSample * stream.Channels / 8;
int samplePos = stream.SamplePosition;
int sampleCount = _sampleLength;
int samplesRead;
bool end = false;
loop = loop && stream.IsLooping;
int lastSample = loop ? stream.LoopEndSample : stream.Samples;
VoidPtr blockAddr = _part1Address;
int blockRemaining = _part1Samples;
while (sampleCount > 0)
{
//Get current block sample count
int blockSamples = Math.Min(blockRemaining, sampleCount);
//Fill zeros
if (end)
Memory.Fill(blockAddr, (uint)(blockSamples * blockAlign), 0);
else
{
//Do we extend within last sample range?
if ((samplePos <= lastSample) && (lastSample < (samplePos + blockSamples)))
{
blockSamples = lastSample - samplePos;
end = true;
}
samplesRead = stream.ReadSamples(blockAddr, blockSamples);
samplePos += samplesRead;
if (samplesRead < blockSamples)
{
blockSamples = samplesRead;
end = true;
}
else if (loop && end)
{
stream.Wrap();
if (samplePos == stream.SamplePosition)
{
samplePos = -1;
break;
}
samplePos = stream.SamplePosition;
end = false;
}
}
blockAddr += blockSamples * blockAlign;
blockRemaining -= blockSamples;
//Wrap to second buffer
if (blockRemaining <= 0)
{
blockAddr = _part2Address;
blockRemaining = _part2Samples;
}
sampleCount -= blockSamples;
}
}