С 32-битным звуком с плавающей запятой все работает нормально, но при использовании 24-битного PCM все ломается. Я получаю либо 0 (при выключенном звуке), либо ~16777184, как только получаю звук.
Я также заметил, что буфер выглядит немного странно:
Код: Выделить всё
160 234 255 160 234 255 128 233 255 128 233 255 64 232 255 64 232 255 32 231 255 32 231 255 0 230 255 0 230 255 224 228 255 224 228 255 192 227 255 192 227 255 160 226 255 160 226 255 160 225 255 160 225 255 128 224 255 128 224 255 128 223 255 128 223 255 160 222 255 160 222 255 160 221 255 160 221 255 192 220 255 192 220 255 192 219 255 192 219 255 0 219 255 0 219 255 32 218 255 32 218 255 96 217 255 96 217 255 128 216 255 128 216 255 224 215 255 224 215 255 32 215 255 32 215 255 128 214 255 128 214 255 192 213 255 192 213 255 64 213 255 64 213 255 160 212 255 160 212 255 32 212 255 32 212 255 160 211 255 160 211 255 32 211 255 32 211 255 192 210 255 192 210 255 96 210 255 96 210 255 0 210 255 0 210 255 192 209 255 192 209 255 128 209 255 128 209 255 64 209 255 64 209 255 32 209 255 32 209 255 224 208 255 224 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 224 208 255 224 208 255 0 209 255 0
Кажется, что значения растут (а затем циклически повторяются) при движении вниз по буферу, при этом громкость не оказывает никакого эффекта. Я бы понял, что LSB сделает это, но не остальное. Это приводит к тому, что вычисление максимума всегда возвращает большое число, поскольку всегда есть триплет рядом с 255, 255, 255. Иногда я получаю немного стабильных данных, где второй и третий бит каждого триплета увеличивается и уменьшается в зависимости от входного объема. Иногда это весь буфер, иногда всего несколько десятков бит, и я не знаю, чем это вызвано.
Вот код для отображения буфера:
Код: Выделить всё
private void OnDataAvailablePCM(object sender, WaveInEventArgs args)
{
StringBuilder sb = new StringBuilder();
foreach (byte b in args.Buffer[0..256])
{
sb.Append(b.ToString() + " ");
}
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => {
(window as MainWindow).bufb.Text = sb.ToString();
}));
}
Код: Выделить всё
private void OnDataAvailablePCM(object sender, WaveInEventArgs args)
{
float max = 0;
// interpret as 24 bit audio
for (int index = 0; index < args.BytesRecorded; index += 3)
{
int sample = (args.Buffer[index + 2] {
(window as MainWindow).bufb.Text = max.ToString();
}));
}
Я пытаюсь понять это уже несколько часов, поэтому любой ввод приветствуется. ТИА
Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-naudio
Мобильная версия