diff --git a/src/multimedia/qqtaudiomanager.cpp b/src/multimedia/qqtaudiomanager.cpp index ed61f429..0fffeea6 100644 --- a/src/multimedia/qqtaudiomanager.cpp +++ b/src/multimedia/qqtaudiomanager.cpp @@ -2,11 +2,11 @@ QQtAudioManager::QQtAudioManager ( QObject* parent ) : QObject ( parent ) { - mInputAudioFormat = QAudioDeviceInfo::defaultInputDevice().preferredFormat(); - mOutputAudioFormat = QAudioDeviceInfo::defaultOutputDevice().preferredFormat(); + mInputAudioFormat = defaultInputDevice().preferredFormat(); + mOutputAudioFormat = defaultOutputDevice().preferredFormat(); - mInputDeviceInfo = QAudioDeviceInfo::defaultInputDevice(); - mOutputDeviceInfo = QAudioDeviceInfo::defaultOutputDevice(); + mInputDeviceInfo = defaultInputDevice(); + mOutputDeviceInfo = defaultOutputDevice(); mInputDevice = NULL; mOutputDevice = NULL; @@ -47,8 +47,10 @@ void QQtAudioManager::startInput() void QQtAudioManager::stopInput() { + //输入设备还开着,那么输入流设备一定开着。这是QQtAudioManager的功能设定。 if ( mInputDevice ) { + //关闭QAudioInput,等于关闭了拾音器。 mInputManager->stop(); mInputManager->deleteLater(); mInputManager = NULL; @@ -96,3 +98,34 @@ void QQtAudioManager::writeBytes ( QByteArray& bytes ) QAudioOutput* QQtAudioManager::outputManager() { return mOutputManager; } QIODevice* QQtAudioManager::outputDevice() { return mOutputDevice; } + +/*用户只需要处理音频输入、输出设备和每个的格式,QAudioInput、QAudioOutput、QIODevice(in + out),都被QQtAudioManager处理了。*/ +void QQtAudioManager::startDefaultInput() +{ + /*使用默认输入设备*/ + mInputDeviceInfo = QQtAudioManager::defaultInputDevice(); + +// pline() << "in prefer" << mInputDeviceInfo.preferredFormat().channelCount() << +// mInputDeviceInfo.preferredFormat().sampleRate() << +// mInputDeviceInfo.preferredFormat().sampleSize(); + +// pline() << "in" << mInputAudioFormat.channelCount() << mInputAudioFormat.sampleRate() << +// mInputAudioFormat.sampleSize(); + + startInput(); +} + +void QQtAudioManager::startDefaultOutput() +{ + /*使用默认输出设备*/ + mOutputDeviceInfo = QQtAudioManager::defaultOutputDevice(); + +// pline() << "out prefer" << mOutputDeviceInfo.preferredFormat().channelCount() << +// mOutputDeviceInfo.preferredFormat().sampleRate() << +// mOutputDeviceInfo.preferredFormat().sampleSize(); + +// pline() << "out" << mOutputAudioFormat.channelCount() << mOutputAudioFormat.sampleRate() << +// mOutputAudioFormat.sampleSize(); + + startOutput(); +} diff --git a/src/multimedia/qqtaudiomanager.h b/src/multimedia/qqtaudiomanager.h index e0d7e282..7294f94f 100644 --- a/src/multimedia/qqtaudiomanager.h +++ b/src/multimedia/qqtaudiomanager.h @@ -31,6 +31,8 @@ * 然后,读写设备即可。 * manager把读写声音设备当做读写一个设备处理。支持本地声卡,蓝牙连接的声卡,hdmi接口上的声卡,其他接口上的声卡。只要系统显示的,一般都支持。 * + * *******使用QQtAudioManager,用户关注输入、输出设备的切换,和输入、输出格式的改变即可,其他的不必关注。******* + * * 原理: * 声音三要素: 采样率, 量化精度, 声道 * 通常我们用一位二进制表示两种状态, 如1表示高电平, 0表示低电平。在音频领域里,如只用一位二进制表示声音,那么只能表示发声和不发声两种状态(蜂鸣器)。 @@ -58,6 +60,10 @@ public: static QAudioDeviceInfo defaultOutputDevice(); /*一般建议设置一个AudioFormat,然后这个format和设置的相等。default为preffered格式*/ + //这里保证输入、输出使用格式相等 或者 不同 + //如果格式不同,在mac电脑上本地输入输出设备是可以使用的,但是对于连接的语音蓝牙话筒,却是不可以使用的,原因未知。 + //格式相同的时候,实在是太好用啦。 + //这个建议默认就相同,但是,在QQtAudioManager当中,并没有直接将其相等处理,如果用户在readyRead槽函数里,可以更改采样率进行某些特殊处理。一般不需要差异处理的,相等就行了。 QAudioFormat& inputAudioFormat ( void ); QAudioFormat& outputAudioFormat ( void ); @@ -79,6 +85,14 @@ public: QAudioOutput* outputManager(); QIODevice* outputDevice(); + //这是个方便 + //如果使用这个函数,建议:设置公共的AudioFormat,比如输出的format,或者输入、输出都支持的Format。 + //这个Format不会跟随默认设备的改变而改变,有初始值,但是用户在使用过程中,有必要关注和更改。 + //prefer和nearest并不是default,所以还是需要用户设置。 + QAudioFormat& defaultAudioFormat(); + void startDefaultInput(); + void startDefaultOutput(); + signals: /*输入音频数据准备就绪,readAll即可读取。*/ void readyRead(); @@ -96,10 +110,10 @@ private: /*操作输入、输出设备的工具*/ QAudioInput* mInputManager; QAudioOutput* mOutputManager; + /*读写输入、输出设备的流控制器,QIODevice*/ QIODevice* mInputDevice; QIODevice* mOutputDevice; - }; #endif // QQTAUDIOMANAGER_H diff --git a/src/qqt_source.pri b/src/qqt_source.pri index 537c0a75..b69f9daa 100644 --- a/src/qqt_source.pri +++ b/src/qqt_source.pri @@ -12,10 +12,8 @@ #if you succeed with LibQQt, please thumb up. #2017年11月10日18:53:56 #------------------------------------------------- -SOURCES = \ - $$PWD/multimedia/qqtaudiomanager.cpp -HEADERS = \ - $$PWD/multimedia/qqtaudiomanager.h +SOURCES = +HEADERS = #root dir HEADERS += $$PWD/qqt.h \ @@ -146,13 +144,21 @@ contains(QKIT_PRIVATE, iOS||iOSSimulator) { #multimedia -#arm mips -#TODO: +wince +android +ios +macOS +win +linux +#audio success. +#video arm mips +#TODO: video +wince +android +ios +macOS +win +linux contains (DEFINES, __MULTIMEDIA__) { + #mplayer contains (DEFINES, __PROCESSMODULE__){ SOURCES += $$PWD/multimedia/qqtmplayer.cpp HEADERS += $$PWD/multimedia/qqtmplayer.h } + + #audio + SOURCES += \ + $$PWD/multimedia/qqtaudiomanager.cpp + HEADERS += \ + $$PWD/multimedia/qqtaudiomanager.h } diff --git a/test/voicetest/mainwindow.cpp b/test/voicetest/mainwindow.cpp index 8723f2c8..1f714a72 100644 --- a/test/voicetest/mainwindow.cpp +++ b/test/voicetest/mainwindow.cpp @@ -228,10 +228,14 @@ void MainWindow::currentOutputRowChanged ( QModelIndex cur, QModelIndex ) void MainWindow::on_pushButton_clicked() { /*这里是自定义输入、输出设备*/ - QString name = ui->inputListWidget->currentIndex().data().toString(); + QString name = QQtAudioManager::defaultInputDevice().deviceName(); + if ( ui->inputListWidget->currentIndex().isValid() ) + name = ui->inputListWidget->currentIndex().data().toString(); QAudioDeviceInfo dev = findInputAudioDeviceInfoByName ( name ); - name = ui->outputListWidget->currentIndex().data().toString(); + name = QQtAudioManager::defaultOutputDevice().deviceName(); + if ( ui->outputListWidget->currentIndex().isValid() ) + name = ui->outputListWidget->currentIndex().data().toString(); QAudioDeviceInfo devOut = findOutputAudioDeviceInfoByName ( name ); /*使用默认输入、输出设备*/ @@ -249,18 +253,43 @@ void MainWindow::on_pushButton_clicked() //如果格式不同,在mac电脑上本地输入输出设备是可以使用的,但是对于连接的语音蓝牙话筒,却是不可以使用的,原因未知。 //格式相同的时候,实在是太好用啦。 //这个建议默认就相同,但是,在QQtAudioManager当中,并没有直接将其相等处理,如果用户在readyRead槽函数里,可以更改采样率进行某些特殊处理。一般不需要差异处理的,相等就行了。 - manager.inputAudioFormat() = manager.outputDeviceInfo().preferredFormat(); - manager.outputAudioFormat() = manager.outputDeviceInfo().preferredFormat(); +// int inBit = ui->inBit->currentIndex().data().toInt(); +// int inChn = ui->inChn->currentIndex().data().toInt(); +// int inRate = ui->intRate->currentIndex().data().toInt(); +// QAudioFormat inFmt; +// inFmt.setChannelCount ( inChn ); +// inFmt.setSampleSize ( inBit ); +// inFmt.setSampleRate ( inRate ); +// inFmt.setCodec ( "audio/pcm" ); +// manager.inputAudioFormat() = inFmt; + + QAudioFormat outFmt = manager.outputDeviceInfo().preferredFormat(); + + int outBit = outFmt.sampleSize(), outChn = outFmt.channelCount(), outRate = outFmt.sampleRate(); + if ( ui->outBit->currentIndex().isValid() ) + outBit = ui->outBit->currentIndex().data().toInt(); + if ( ui->outChn->currentIndex().isValid() ) + outChn = ui->outChn->currentIndex().data().toInt(); + if ( ui->outRate->currentIndex().isValid() ) + outRate = ui->outRate->currentIndex().data().toInt(); + + outFmt.setChannelCount ( outChn ); + outFmt.setSampleSize ( outBit ); + outFmt.setSampleRate ( outRate ); + outFmt.setCodec ( "audio/pcm" ); + + manager.inputAudioFormat() = outFmt; + manager.outputAudioFormat() = outFmt; pline() << "in prefer" << dev.preferredFormat().channelCount() << dev.preferredFormat().sampleRate() << dev.preferredFormat().sampleSize(); - pline() << "out prefer" << devOut.preferredFormat().channelCount() << devOut.preferredFormat().sampleRate() << - devOut.preferredFormat().sampleSize(); - pline() << "in" << manager.inputAudioFormat().channelCount() << manager.inputAudioFormat().sampleRate() << manager.inputAudioFormat().sampleSize(); + pline() << "out prefer" << devOut.preferredFormat().channelCount() << devOut.preferredFormat().sampleRate() << + devOut.preferredFormat().sampleSize(); + pline() << "out" << manager.outputAudioFormat().channelCount() << manager.outputAudioFormat().sampleRate() << manager.outputAudioFormat().sampleSize(); @@ -316,3 +345,12 @@ void MainWindow::on_outHS_valueChanged ( int value ) pline() << "输出音量" << vol ; manager.outputManager()->setVolume ( vol ); } + +void MainWindow::on_pushButton_4_clicked() +{ + manager.inputAudioFormat() = QQtAudioManager::defaultOutputDevice().preferredFormat(); + manager.outputAudioFormat() = QQtAudioManager::defaultOutputDevice().preferredFormat(); + + manager.startDefaultInput(); + manager.startDefaultOutput(); +} diff --git a/test/voicetest/mainwindow.h b/test/voicetest/mainwindow.h index d9a94570..13610ab4 100644 --- a/test/voicetest/mainwindow.h +++ b/test/voicetest/mainwindow.h @@ -32,6 +32,8 @@ private slots: void on_outHS_valueChanged ( int value ); + void on_pushButton_4_clicked(); + private: Ui::MainWindow* ui; QQtAudioManager manager; diff --git a/test/voicetest/mainwindow.ui b/test/voicetest/mainwindow.ui index 30863dd3..82aac316 100644 --- a/test/voicetest/mainwindow.ui +++ b/test/voicetest/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 917 - 587 + 1198 + 591 @@ -91,6 +91,19 @@ stop (optional) + + + + 820 + 40 + 291 + 32 + + + + start take voice and play (default device) + +