123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- using System;
- using System.Linq.Expressions;
- using System.Runtime.InteropServices;
- using System.Threading;
- using System.Threading.Channels;
- using Bmp.Core.Playback.Inputs;
- using Bmp.Core.Playback.Outputs.NAudioASIO;
- namespace Bmp.Poc.PoCs;
- internal static class PocAsioDSFPlay
- {
- public static void MainFunc()
- {
- var dsfFilePath = Const.FileDsf;
- var asioDriverName = "Creative SB USB DSD ASIO Device";
- var dsfStream = new DsfSourceStream(dsfFilePath);
- var drv = new AsioDriverExt(asioDriverName);
- drv.Future_SetIoFormat_DSD();
- var flagDSD1 = drv.Future_GetIoFormat_Is_DSD();
- if (flagDSD1)
- {
- var flag = drv.IsSampleRateSupported(dsfStream.SampleRate);
- if (flag) drv.SetSampleRate(dsfStream.SampleRate, false);
- else throw new NotSupportedException("Failure to set sample rate");
- }
- else
- {
- throw new NotSupportedException("Device is not support DSD");
- }
- var nbSamples = drv.CreateBuffers(dsfStream.ChannelNum, 0, false);
- var outputBufBytes = nbSamples / 8;
- var channelBlockBuf = new byte[dsfStream.BlockSizePerChannel * dsfStream.ChannelNum];
- var channelOffset = 0;
- //生产者-消费者 模式, 结束检测
- bool ReadBlock()
- {
- var readCount = 0;
- do
- {
- var read = dsfStream.Read(channelBlockBuf, readCount, channelBlockBuf.Length - readCount);
- if (read == 0) return false;
- readCount += read;
- } while (readCount < channelBlockBuf.Length);
- return true;
- }
- ReadBlock();
- drv.FillBufferCallback = (inputChannels, outputChannels) =>
- {
- for (int iBuf = 0; iBuf < outputBufBytes; iBuf++)
- {
- for (int ich = 0; ich < dsfStream.ChannelNum; ich++)
- {
- Marshal.WriteByte(outputChannels[ich] + iBuf, channelBlockBuf[dsfStream.BlockSizePerChannel * ich + channelOffset]);
- }
- channelOffset++;
- if (channelOffset >= dsfStream.BlockSizePerChannel)
- {
- if (!ReadBlock())
- {
- drv.Stop(); //END
- return;
- }
- channelOffset = 0;
- }
- }
- };
- drv.Start();
- while (true)
- {
- Console.WriteLine($"{dsfStream.CurrentTime}");
- Thread.Sleep(3000);
- dsfStream.CurrentTime += TimeSpan.FromSeconds(-1);
- }
- }
- }
|