终于明白了:bass.dll 允许使用该方法分别为每个扬声器应用一个矩阵作为音量设置BassMix.BASS_Mixer_ChannelSetMatrix(int streamHandle, float[,] volumeMatrix)
。你可以在这里看到一个示例,他们正在使用它来将立体声流上混到四个扬声器。在我为解决我的问题而创建的完整课程之下。
public class SeparateVolumeLevelPlayer : IDisposable
{
private readonly int outputMixerStream;
private readonly int inputStream;
private readonly int numberOfSpeakers;
public SeparateVolumeLevelPlayer(string fileName, int numberOfSpeakers)
{
this.numberOfSpeakers = numberOfSpeakers;
outputMixerStream = BassMix.BASS_Mixer_StreamCreate(44100, numberOfSpeakers, BASSFlag.BASS_MIXER_MATRIX);
ThrowOnError();
// create a stream from the media file
inputStream = Bass.BASS_StreamCreateFile(fileName, 0L, 0L, BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_MIXER_MATRIX | BASSFlag.BASS_SAMPLE_MONO);
ThrowOnError();
// add the stream to the mixer
BassMix.BASS_Mixer_StreamAddChannel(outputMixerStream, inputStream, BASSFlag.BASS_MIXER_MATRIX);
ThrowOnError();
}
public void Play()
{
// start playback of the mixed streams
Bass.BASS_ChannelPlay(outputMixerStream, false);
ThrowOnError();
}
public void SetVolume(float[] volumeValues)
{
if (volumeValues == null)
{
throw new ArgumentNullException("volumeValues");
}
if (volumeValues.Length != numberOfSpeakers)
{
string message =
string.Format("You must pass a volume level for every speaker. You provided {0} values for {1} speakers",
volumeValues.Length, numberOfSpeakers);
throw new ArgumentException(message);
}
var volumeMatrix = new float[numberOfSpeakers, 1];
for (int i = 0; i < numberOfSpeakers; i++)
{
volumeMatrix[i, 0] = volumeValues[i];
}
// adjust the volume using the matrix
BassMix.BASS_Mixer_ChannelSetMatrix(inputStream, volumeMatrix);
ThrowOnError();
}
private static void ThrowOnError()
{
BASSError err = Bass.BASS_ErrorGetCode();
if (err != BASSError.BASS_OK)
{
throw new ApplicationException(string.Format("bass.dll reported {0}.", err));
}
}
public void Dispose()
{
Bass.BASS_StreamFree(inputStream);
Bass.BASS_StreamFree(outputMixerStream);
}
}