Multichannel Audio Output using QAudioOutput
-
So some quick background, I am trying to make a surround sound environment in which the user has a lot of control over which sounds are played where. These sounds are coming exclusively from .aiff files (don't ask why) which means that I pretty much just have the raw samples (16 bit Big Endian Samples). I am trying to use my sound card (which has multiple outputs) to do this, however I'm having some issues. I tried to simply make a 441Hz wave to play out of each speaker, but I don't think I'm doing it right because all I'm getting is garbage sound.
I know there are a few things I'm doing wrong, so could someone try to give me some advice?
(this is a small test program i am writing to test it so that i don't have to go through all my other code [basically a proof of concept])
@#include "mainwindow.h"
mainWindow::mainWindow(QWidget *parent) :
QMainWindow(parent)
{
this->resize(550,900);
QWidget * central = new QWidget();
this->setCentralWidget(central);
out = new QLabel(central);
out->resize(500,850);
out->move(25,25);
QString * outString = new QString();QList<QAudioDeviceInfo> avail = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); for(int i=0; i< avail.length();i++) { QAudioDeviceInfo temp = avail.at(i); outString->append(temp.deviceName() + "\n"); QList<int> count = temp.supportedChannelCounts(); outString->append("channels:"); for(int j=0; j<count.length();j++) { outString->append(QString::number(count.at(j))+" "); } outString->append("\n"); QList<int> bits = temp.supportedSampleSizes(); outString->append("bits:"); for(int j=0; j<bits.length();j++) { outString->append(QString::number(bits.at(j))+" "); } outString->append("\n"); QList<int> rates = temp.supportedSampleRates(); outString->append("bitrates:"); for(int j=0; j<rates.length();j++) { outString->append(QString::number(rates.at(j))+" "); } outString->append("\n"); QList<QString> codecs = temp.supportedCodecs(); outString->append("codecs:"); for(int j=0; j<codecs.length();j++) { outString->append(codecs.at(j)+" "); } outString->append("\n"); QList<QAudioFormat::SampleType> types = temp.supportedSampleTypes(); outString->append("types:"); for(int j=0; j<codecs.length();j++) { outString->append(QString::number(types.at(j))+" "); } outString->append("\n"); outString->append("\n"); } out->setText(*outString); QAudioOutput * toPlaywith; QAudioFormat format; format.setFrequency(44100); format.setChannelCount(4); format.setSampleSize(16); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::SignedInt); QAudioDeviceInfo info(avail.at(0)); if (!info.isFormatSupported(format)) { qDebug()<<"raw audio format not supported by backend, cannot play audio."; return; } toPlaywith = new QAudioOutput(format, this); QBuffer * tempDev = new QBuffer(); tempDev->open(QIODevice::ReadWrite); tempDev->seek(0); toPlaywith->start(tempDev); char* trans = new char[88200]; for(int i=0;i<44100;i++) { uint16_t datapoint = cos((i*2*3.141592)/44100) * 0x7F; trans[2*i] = datapoint; trans[2*i+1] = datapoint/16; //trans[2] = datapoint; //trans[3] = datapoint/16; //trans[4] = datapoint; //trans[5] = datapoint/16; //trans[6] = datapoint; //trans[7] = datapoint/16; } int i=0; qint64 ActPos = tempDev->pos(); tempDev->seek(tempDev->size()); tempDev->write(trans,2); tempDev->seek(ActPos); while(i<20) { qint64 ActPos = tempDev->pos(); tempDev->seek(tempDev->size()); tempDev->write(trans,88200); tempDev->seek(ActPos); i++; }
}
@