Цитата Сообщение от ZXMAK Посмотреть сообщение
Интересно услышать ваше мнение по поводу качества звука
Звук не слушал, но заглянул в исходники. Очень странный микшер- сложение сразу двухканальных семплов. Само по себе оно нормальное, но вот ненормированные коэффициенты в m_mixerPreset могут дать переполнение при сложении, что чревато переползанием левого канала в правый и клиппингом в правом канале (или наоборот, не суть важно).
Раз у тебя есть отличное событие OnVolumeChanged, заюзай его по полной- считай таблицу в 32768 элементов примерно следующим способом:
Код:
for (int idx = 0; idx != 32768; ++idx) {
  int volA = vol_table[idx & 31] * volume / 65535;
  int volB = vol_table[(idx >> 5) & 31] * volume / 65535;
  int volC = vol_table[(idx >> 10) & 31] * volume / 65535;
  int levAL = m_mixerPreset[0];
  int levAR = m_mixerPreset[1];
  int levBL = m_mixerPreset[2];
  int levBR = m_mixerPreset[3];
  int levCL = m_mixerPreset[4];
  int levCR = m_mixerPreset[5];
  int volL = (volA * levAL + volB * levBL + volC * levCL) / 300;
  int volR = (volA * levAR + volB * levBR + volC * levCR) / 300;
  m_volTable[idx] = volL + (volR << 16);
}
и потом в коде:
Код:
var sample = m_volTable[(mixC << 10) | (mixB << 5) | mixA];
UpdateDac(m_lastTime, (ushort)sample, (ushort)(sample >> 16));
Вообще, mixA/mixB/mixC тоже можно считать практически параллельно, но это уже несколько сложнее.