mercredi 15 avril 2015

Surround sound (5.1) Web Audio support

I'm trying to create simple aplication to play stereo / mono music in all 5.1 channels. After studying Web audio specification I spend 4 hours to try code it. Unfortunately I got nowhere. Audio is playing only over 2 channels. If I set merger.channelCountMode = "explicit" it plays only from center channel.


If I set merger.channelInterpretation = "discrete"; it plays only from left channel. What I'm doing wrong? Thank you very much. My code:





var audio;

function PlaySurround(){
context = new AudioContext();
audio = new Audio();
audio.src = "a.mp3";
var source = context.createMediaElementSource(audio);
context.destination.channelCount = 6;
audio.currentTime = Math.random() * 200;


//Create a splitter to "separete" the stereo audio data to two channels.
var splitter = context.createChannelSplitter(6);
splitter.channelCount = 6;
//splitter.channelInterpretation = "discrete";
//splitter.channelCountMode = "explicit";

console.log(splitter);
//Connect your source to the splitter (usually, you will do it with the last audio node before context destination)
source.connect(splitter);

//Create two gain nodes (one for each side of the stereo image)
var panLeft = context.createGain();
var panRight = context.createGain();

var panLeftSurround = context.createGain();
var panRightSurround = context.createGain();

var panCenter = context.createGain();
var panSubwoofer = context.createGain();

//Connect the splitter channels to the Gain Nodes that we've just created
splitter.connect(panLeft, 0);
splitter.connect(panRight, 1);

splitter.connect(panCenter, 2);
splitter.connect(panSubwoofer, 3);

splitter.connect(panLeftSurround, 4);
splitter.connect(panRightSurround, 5);

panLeft.gain.value = 1;
panRight.gain.value = 1;

panLeftSurround.gain.value = 1;
panRightSurround.gain.value = 1;

panCenter.gain.value = 1;
panSubwoofer.gain.value = 1;


//Create a merger node, to get both signals back together
var merger = context.createChannelMerger(6);
merger.channelCount = 6;
//merger.channelInterpretation = "discrete";
merger.channelCountMode = "explicit";

console.log(merger);

panLeft.connect(merger, 0, 0);
panRight.connect(merger, 0, 1);

panCenter.connect(merger, 0, 2);
panSubwoofer.connect(merger, 0, 3);

panLeftSurround.connect(merger, 0, 4);
panRightSurround.connect(merger, 0, 5);

//Connect the Merger Node to the final audio destination (your speakers)

merger.connect(context.destination);

source.mediaElement.play();
}



Aucun commentaire:

Enregistrer un commentaire