Demo::Demo(QWidget *parent) : QMainWindow(parent), ui(new Ui::Demo) { ui->setupUi(this); //create pointers QJFastFIRFilter *fastfir; QJSlowFIRFilter *slowfir; //create fast fir LPF fastfir = new QJFastFIRFilter(this); fastfir->setKernel(QJFilterDesign::LowPassHanning(800,48000,1001)); //create slow fir LPF slowfir = new QJSlowFIRFilter(this); slowfir->setKernel(QJFilterDesign::LowPassHanning(800,48000,1001)); //make some data QVector<kffsamp_t> buf; buf.resize(48000*10); //time slow fir timer.start(); slowfir->Update(buf); nMilliseconds = timer.elapsed(); ui->plainTextEdit->appendPlainText(((QString)"Slow FIR took %1 ms for %2 double samples with a kernel of 1001 samples").arg(nMilliseconds).arg(buf.size())); //time fast fir timer.start(); fastfir->Update(buf); nMilliseconds = timer.elapsed(); ui->plainTextEdit->appendPlainText(((QString)"Fast FIR took %1 ms for %2 double samples with a kernel of 1001 samples").arg(nMilliseconds).arg(buf.size())); //use the fast fir to LPF some random samples and output them to the sound card ui->plainTextEdit->appendPlainText("Outputting 800Hz low pass filtered random samples to the soundcard using the fast fir"); QAudioFormat format; format.setChannelCount(1); format.setCodec("audio/pcm"); format.setSampleRate(48000); format.setSampleSize(16); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::SignedInt); generator = new Generator(format, this); QAudioOutput *audiooutput = new QAudioOutput(format, this); generator->start(); audiooutput->start(generator); }
int test_2() { qyvlik::FFmpegStream* ffmpegStream = new qyvlik::FFmpegStream(); QAudioFormat format; // Set up the format, eg. format.setSampleRate(44100); format.setChannelCount(2); format.setCodec("audio/pcm"); format.setSampleType(QAudioFormat::SignedInt); format.setSampleSize(16); format.setByteOrder(QAudioFormat::LittleEndian); QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); if (!info.isFormatSupported(format)) { qDebug() << "Raw audio format not supported by backend, cannot play audio."; return -1; } ffmpegStream->setFileName("E:/Test/1.mp3"); QAudioOutput *audio; audio = new QAudioOutput(format); audio->start(ffmpegStream); qDebug() << "Play Finished~"; }
void WavSound::play() { QFile *file = new QFile(fileName); file->open(QIODevice::ReadOnly); QAudioFormat f; readHeader(&f, file); QAudioFormat format = f; QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); if (!info.isFormatSupported(format)) { qWarning() << "Raw audio format not supported by backend, cannot play audio."; return; } //seek(0x4e*4); //...avoiding clicks from the wav files file->seek(0x4e); QAudioOutput *audio = new QAudioOutput(format, NULL); if(file->size()<30000) audio->setBufferSize(10000); audio->setVolume(0.5); connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State))); audio->start(file); }
void xmppClient::slotConnected() { QXmppCall *call = qobject_cast<QXmppCall*>(sender()); Q_ASSERT(call); qDebug() << "Call connected"; QXmppRtpChannel *channel = call->audioChannel(); // prepare audio format QAudioFormat format; format.setFrequency(channel->payloadType().clockrate()); format.setChannels(channel->payloadType().channels()); format.setSampleSize(16); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::SignedInt); // the size in bytes of the audio buffers to/from sound devices // 160 ms seems to be the minimum to work consistently on Linux/Mac/Windows const int bufferSize = (format.frequency() * format.channels() * (format.sampleSize() / 8) * 160) / 1000; // initialise audio output QAudioOutput *audioOutput = new QAudioOutput(format, this); audioOutput->setBufferSize(bufferSize); audioOutput->start(channel); // initialise audio input QAudioInput *audioInput = new QAudioInput(format, this); audioInput->setBufferSize(bufferSize); audioInput->start(channel); }
void xmppClient::slotAudioModeChanged(QIODevice::OpenMode mode) { QXmppCall *call = qobject_cast<QXmppCall*>(sender()); Q_ASSERT(call); QXmppRtpAudioChannel *channel = call->audioChannel(); // prepare audio format QAudioFormat format; format.setSampleRate(channel->payloadType().clockrate()); format.setChannelCount(channel->payloadType().channels()); format.setSampleSize(16); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::SignedInt); // the size in bytes of the audio buffers to/from sound devices // 160 ms seems to be the minimum to work consistently on Linux/Mac/Windows const int bufferSize = (format.sampleRate() * format.channelCount() * (format.sampleSize() / 8) * 160) / 1000; if (mode & QIODevice::ReadOnly) { // initialise audio output QAudioOutput *audioOutput = new QAudioOutput(format, this); audioOutput->setBufferSize(bufferSize); audioOutput->start(channel); } if (mode & QIODevice::WriteOnly) { // initialise audio input QAudioInput *audioInput = new QAudioInput(format, this); audioInput->setBufferSize(bufferSize); audioInput->start(channel); } }
void TSoundOutputDeviceImp::play(const TSoundTrackP &st, TINT32 s0, TINT32 s1, bool loop, bool scrubbing) { if (!doSetStreamFormat(st->getFormat())) return; MyData *myData = new MyData(); myData->imp = shared_from_this(); myData->totalPacketCount = s1 - s0; myData->fileByteCount = (s1 - s0) * st->getSampleSize(); myData->entireFileBuffer = new char[myData->fileByteCount]; memcpy(myData->entireFileBuffer, st->getRawData() + s0 * st->getSampleSize(), myData->fileByteCount); m_isPlaying = true; myData->isLooping = loop; QAudioFormat format; QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); format.setSampleSize(st->getBitPerSample()); format.setCodec("audio/pcm"); format.setChannelCount(st->getChannelCount()); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(st->getFormat().m_signedSample ? QAudioFormat::SignedInt : QAudioFormat::UnSignedInt); format.setSampleRate(st->getSampleRate()); QList<QAudioFormat::Endian> sbos = info.supportedByteOrders(); QList<int> sccs = info.supportedChannelCounts(); QList<int> ssrs = info.supportedSampleRates(); QList<QAudioFormat::SampleType> sstypes = info.supportedSampleTypes(); QList<int> ssss = info.supportedSampleSizes(); QStringList supCodes = info.supportedCodecs(); if (!info.isFormatSupported((format))) { format = info.nearestFormat(format); int newChannels = format.channelCount(); int newBitsPerSample = format.sampleSize(); int newSampleRate = format.sampleRate(); QAudioFormat::SampleType newSampleType = format.sampleType(); QAudioFormat::Endian newBo = format.byteOrder(); } int test = st->getSampleCount() / st->getSampleRate(); QByteArray *data = new QByteArray(myData->entireFileBuffer, myData->fileByteCount); QBuffer *newBuffer = new QBuffer; newBuffer->setBuffer(data); newBuffer->open(QIODevice::ReadOnly); newBuffer->seek(0); if (m_audioOutput == NULL) { m_audioOutput = new QAudioOutput(format, NULL); } m_audioOutput->start(newBuffer); m_audioOutput->setVolume(m_volume); }
void push(double *left, double *right, int length, int offset) { if (!device) { device = out->start(); } int remain = length; int finished = 0; while (0 < remain) { int amount = kUnitBufferLength / 4 <= remain ? kUnitBufferLength / 4 : remain; int index = 0; for (int i = 0; i < amount; i++) { int16_t leftData = (int16_t)(left[i + finished + offset] * 32767); int16_t rightData = (int16_t)(right[i + finished + offset] * 32767); buffer[index++] = static_cast<uint8_t *>(&leftData)[0]; buffer[index++] = static_cast<uint8_t *>(&leftData)[1]; buffer[index++] = static_cast<uint8_t *>(&rightData)[0]; buffer[index++] = static_cast<uint8_t *>(&rightData)[1]; } int bytesToWrite = amount * 4; int bytesWritten = 0; while (bytesWritten < bytesToWrite) { int actualWrittenBytes = device->write( (const char *)(buffer + bytesWritten), (qint64)(bytesToWrite - bytesWritten)); bytesWritten += actualWrittenBytes; } remain -= amount; finished += amount; } }
int test_1(QObject* a) { QAudioFormat format; // Set up the format, eg. format.setSampleRate(44100); format.setChannelCount(2); format.setCodec("audio/pcm"); format.setSampleType(QAudioFormat::SignedInt); format.setSampleSize(16); format.setByteOrder(QAudioFormat::LittleEndian); QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); if (!info.isFormatSupported(format)) { qDebug() << "Raw audio format not supported by backend, cannot play audio."; return -1; } char filename[1024]; printf("input file name :"); scanf("%s",filename); fflush(stdin); fflush(stdout); printf("start audio \n"); QAudioOutput *audio; audio = new QAudioOutput(format, a); QIODevice *out = audio->start(); #if 0 qDebug()<< out->isSequential() << " swquential"; // 不是顺序设备,是随机设备 #endif decodeAndPlay(filename,out); }
void NotificationSound::playSound() { //QSound::play(":/sound/notification_sound.wav"); //return; qreal frequency = ((sFrequency <= 0)?2000:sFrequency); qreal mseconds = ((sDuration <= 0)?1000:sDuration); quint8 volume = ((sVolume <= 0)?1:sVolume); qreal sampleRate = 2.0 * M_PI / (192000./frequency); QByteArray bytebuf; bytebuf.resize(mseconds * 192); for (int i=0; i < bytebuf.size(); i++) { bytebuf[i] = (quint8)(qreal(255) * qSin(qreal(i) * sampleRate)); } QDataStream stream(&bytebuf, QIODevice::ReadWrite); QAudioFormat format; format.setSampleRate(192000); format.setChannelCount(1); format.setSampleSize(8); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::UnSignedInt); QAudioOutput * audio = new QAudioOutput(format, this); audio->setVolume(1.0 * (qreal(volume + 1)/4)); audio->setBufferSize(bytebuf.size()); audio->start(stream.device()); QEventLoop loop; QTimer::singleShot(mseconds*2, &loop, SLOT(quit())); loop.exec(); }
bool TSoundOutputDeviceImp::doStopDevice() { m_isPlaying = false; m_audioOutput->stop(); return true; }