#c# #audio #stream #naudio
#c# #Аудио #поток #naudio
Вопрос:
Я пишу программу, которая должна имитировать сигнал «DCF77» для изменения времени радиочасов. Для того, чтобы это работало, я должен воспроизводить звук непрерывно (без прерывистых звуков; плавно), используя изменяющиеся волны (меняющиеся уровни громкости).
Мне сказали использовать NAudio и буфер, который хранит сэмплы / 1 сэмпл, отправляет их на звуковую карту и запрашивает больше сэмплов по мере необходимости.
Но как мне это реализовать?
В моем текущем коде есть массив из 60 элементов, называемых битами, который используется для определения того, как звук меняется каждую секунду. Этот массив пересчитывается раз в минуту.
Если вы не знали, сигнал DCF77 кодирует двоичную информацию следующим образом: 0 означает, что первые 0,1 секунды каждой секунды имеют громкость около 15% от нормального уровня. 1 означает то же самое, но в течение 0,2 секунды.
Теперь у меня есть класс SineWaveProvider32:
class SineWaveProvider32 : WaveProvider32
{
int sample;
public SineWaveProvider32()
{
Frequency = 1000;
Amplitude = 0.25f;
}
public float Frequency { get; set; }
public float Amplitude { get; set; }
public override int Read(float[] buffer, int offset, int sampleCount)
{
int sampleRate = WaveFormat.SampleRate;
for(int i = 0; i < sampleCount; i )
{
buffer[i offset] = (float)(Amplitude * Math.Sin((2 * Math.PI * sample * Frequency) / sampleRate));
sample ;
if(sample >= sampleRate)
{
sample = 0;
}
}
return sampleCount;
}
}
А также объект WaveOut
WaveOut waveOut;
и в основном коде есть этот метод:
void StartStopSineWave()
{
if (waveOut == null)
{
var sineWaveProvider = new SineWaveProvider32();
sineWaveProvider.SetWaveFormat(192000, 1);
sineWaveProvider.Frequency = 1000;
sineWaveProvider.Amplitude = 0.25f;
waveOut = new WaveOut();
waveOut.Init(sineWaveProvider);
waveOut.Play();
}
else
{
waveOut.Stop();
waveOut.Dispose();
waveOut = null;
}
}
Пожалуйста, обратите внимание, что я относительно новичок в C #, и извините, если это дублирующий вопрос, но я не смог найти никакой полезной информации или, по крайней мере, не понял ее.
Редактировать: Для всех, у кого может возникнуть такая же проблема, я решил ее, выдав постоянную синусоидальную волну и изменив громкость в режиме реального времени с помощью
waveOut.Volume
Я знаю, что это не идеально, но это работает для того, что я делаю.