1
0
mirror of https://gitee.com/drabel/LibQQt.git synced 2025-01-04 10:18:44 +08:00
LibQQt/test/voicetest/mainwindow.cpp

428 lines
13 KiB
C++
Raw Normal View History

2018-02-12 11:11:09 +08:00
#include "mainwindow.h"
2018-02-10 00:32:32 +08:00
#include "ui_mainwindow.h"
#include <qqtaudiomanager.h>
#include <qqtcore.h>
2018-02-10 23:49:06 +08:00
#include <qsound.h>
#include <qsoundeffect.h>
#include <qqtaudioeffect.h>
2018-02-10 00:32:32 +08:00
MainWindow::MainWindow ( QWidget* parent ) :
QMainWindow ( parent ),
ui ( new Ui::MainWindow )
{
ui->setupUi ( this );
2018-02-10 23:49:06 +08:00
connect ( &manager, SIGNAL ( readyRead() ), this, SLOT ( readyRead() ) );
2018-02-10 00:32:32 +08:00
QList<QAudioDeviceInfo> ladInfo;
ladInfo = QAudioDeviceInfo::availableDevices ( QAudio::AudioInput );
QListIterator<QAudioDeviceInfo> itor ( ladInfo );
pline() << "本机音频输入设备列表";
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
pline() << itor.next().deviceName();
2018-02-10 00:32:32 +08:00
pline() << "默认输入设备" << QAudioDeviceInfo::defaultInputDevice().deviceName();
pline() << "输入设备详细信息";
itor.toFront();
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
{
QAudioDeviceInfo adInfo = itor.next();
pline() << adInfo.deviceName();
pline() << adInfo.supportedByteOrders();
pline() << adInfo.supportedChannelCounts();
pline() << adInfo.supportedCodecs();
pline() << adInfo.supportedSampleRates();
pline() << adInfo.supportedSampleSizes();
pline() << adInfo.supportedSampleTypes();
}
QList<QAudioDeviceInfo> ladOutputInfo;
ladOutputInfo = QAudioDeviceInfo::availableDevices ( QAudio::AudioOutput );
QListIterator<QAudioDeviceInfo> itor2 ( ladOutputInfo );
pline() << "本机音频输出设备列表";
2018-02-10 00:32:32 +08:00
while ( itor2.hasNext() )
pline() << itor2.next().deviceName();
2018-02-10 00:32:32 +08:00
pline() << "默认输出设备" << QAudioDeviceInfo::defaultOutputDevice().deviceName();
pline() << "输出设备详细信息";
itor2.toFront();
2018-02-10 00:32:32 +08:00
while ( itor2.hasNext() )
{
QAudioDeviceInfo adInfo = itor2.next();
pline() << adInfo.deviceName();
pline() << adInfo.supportedByteOrders();
pline() << adInfo.supportedChannelCounts();
pline() << adInfo.supportedCodecs();
pline() << adInfo.supportedSampleRates();
pline() << adInfo.supportedSampleSizes();
pline() << adInfo.supportedSampleTypes();
}
pline() << "..........................";
connect ( ui->inputListWidget->selectionModel(), SIGNAL ( currentRowChanged ( QModelIndex, QModelIndex ) ),
this, SLOT ( currentInputRowChanged ( QModelIndex, QModelIndex ) ) );
connect ( ui->outputListWidget->selectionModel(), SIGNAL ( currentRowChanged ( QModelIndex, QModelIndex ) ),
this, SLOT ( currentOutputRowChanged ( QModelIndex, QModelIndex ) ) );
2018-02-10 13:18:08 +08:00
// on_pushButton_2_clicked();
// ui->inputListWidget->setCurrentRow ( 0 );
// ui->outputListWidget->setCurrentRow ( 0 );
// ui->inputListWidget->setFocus();
ui->inHS->setRange ( 0, 100 );
ui->inHS->setValue ( 100 );
ui->outHS->setRange ( 0, 100 );
ui->outHS->setValue ( 100 );
//pline() << QSoundEffect::supportedMimeTypes();
QSoundEffect e;
e.setLoopCount ( 1 );
e.setVolume ( 0.9f );
e.setMuted ( false );
//不响
QUrl u;
u.setUrl ( "http://xmdx.sc.chinaz.com/Files/DownLoad/sound1/201802/9733.wav" );
e.setSource ( u );
//e.play();
//响
e.setSource ( QUrl::fromLocalFile ( "://9733" ) );
//e.play();
//响
//QSound::play ( "://9733" );
QQtWavAudioEffect e1;
e1.play ( "://9733" );
//e1.play ( "./res/9733.wav" );
//QApplication::beep();
QQtSleep ( 3000 );
2018-02-10 00:32:32 +08:00
}
MainWindow::~MainWindow()
{
delete ui;
}
QAudioDeviceInfo MainWindow::findInputAudioDeviceInfoByName ( QString devName )
{
QList<QAudioDeviceInfo> ladInfo;
ladInfo = QQtAudioManager::availableInputDevices();
QListIterator<QAudioDeviceInfo> itor ( ladInfo );
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
{
QAudioDeviceInfo adInfo = itor.next();
2018-02-10 00:32:32 +08:00
if ( devName == adInfo.deviceName() )
return adInfo;
}
}
QAudioDeviceInfo MainWindow::findOutputAudioDeviceInfoByName ( QString devName )
{
QList<QAudioDeviceInfo> ladInfo;
ladInfo = QQtAudioManager::availableOutputDevices();
QListIterator<QAudioDeviceInfo> itor ( ladInfo );
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
{
QAudioDeviceInfo adInfo = itor.next();
2018-02-10 00:32:32 +08:00
if ( devName == adInfo.deviceName() )
return adInfo;
}
}
void MainWindow::on_pushButton_2_clicked()
{
ui->inputListWidget->clear();
QList<QAudioDeviceInfo> ladInfo;
ladInfo = QQtAudioManager::availableInputDevices();
QListIterator<QAudioDeviceInfo> itor ( ladInfo );
pline() << "本机音频输入设备列表";
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
{
QAudioDeviceInfo adInfo = itor.next();
pline() << adInfo.deviceName();
ui->inputListWidget->addItem ( adInfo.deviceName() );
}
ui->outputListWidget->clear();
QList<QAudioDeviceInfo> ladOutputInfo;
ladOutputInfo = QQtAudioManager::availableOutputDevices();
QListIterator<QAudioDeviceInfo> itor2 ( ladOutputInfo );
pline() << "本机音频输出设备列表";
2018-02-10 00:32:32 +08:00
while ( itor2.hasNext() )
{
QAudioDeviceInfo adInfo = itor2.next();
pline() << adInfo.deviceName();
ui->outputListWidget->addItem ( adInfo.deviceName() );
}
}
void MainWindow::currentInputRowChanged ( QModelIndex cur, QModelIndex )
{
/*在清空设备列表时clear函数会调用多次这个函数。在这里用cur valid加以过滤否则程序会崩溃退出。*/
if ( !cur.isValid() )
return;
ui->inBit->clear();
ui->inChn->clear();
ui->intRate->clear();
QString name = cur.data().toString();
QAudioDeviceInfo dev = findInputAudioDeviceInfoByName ( name );
if ( dev.isNull() )
return;
QList<int> size = dev.supportedSampleSizes();
QListIterator<int> itor ( size );
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
{
QString s0 = QString::number ( itor.next() );
ui->inBit->addItem ( s0 );
}
itor = dev.supportedChannelCounts();
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
{
QString s0 = QString::number ( itor.next() );
ui->inChn->addItem ( s0 );
}
itor = dev.supportedSampleRates();
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
{
QString s0 = QString::number ( itor.next() );
ui->intRate->addItem ( s0 );
}
}
void MainWindow::currentOutputRowChanged ( QModelIndex cur, QModelIndex )
{
if ( !cur.isValid() )
return;
ui->outBit->clear();
ui->outChn->clear();
ui->outRate->clear();
QString name = cur.data().toString();
QAudioDeviceInfo dev = findOutputAudioDeviceInfoByName ( name );
if ( dev.isNull() )
return;
QList<int> size = dev.supportedSampleSizes();
QListIterator<int> itor ( size );
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
{
QString s0 = QString::number ( itor.next() );
ui->outBit->addItem ( s0 );
}
itor = dev.supportedChannelCounts();
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
{
QString s0 = QString::number ( itor.next() );
ui->outChn->addItem ( s0 );
}
itor = dev.supportedSampleRates();
2018-02-10 00:32:32 +08:00
while ( itor.hasNext() )
{
QString s0 = QString::number ( itor.next() );
ui->outRate->addItem ( s0 );
}
}
2018-02-10 13:18:08 +08:00
/*
*
* manager对其分开管理
* manager管理start\stop等接口manager内部的inputManager和outputManager负责其他接口
* manager管理
*/
2018-02-10 00:32:32 +08:00
void MainWindow::on_pushButton_clicked()
{
/*这里是自定义输入、输出设备*/
2018-02-10 16:12:47 +08:00
QString name = QQtAudioManager::defaultInputDevice().deviceName();
2018-02-10 16:12:47 +08:00
if ( ui->inputListWidget->currentIndex().isValid() )
name = ui->inputListWidget->currentIndex().data().toString();
2018-02-10 00:32:32 +08:00
QAudioDeviceInfo dev = findInputAudioDeviceInfoByName ( name );
2018-02-10 16:12:47 +08:00
name = QQtAudioManager::defaultOutputDevice().deviceName();
2018-02-10 16:12:47 +08:00
if ( ui->outputListWidget->currentIndex().isValid() )
name = ui->outputListWidget->currentIndex().data().toString();
2018-02-10 00:32:32 +08:00
QAudioDeviceInfo devOut = findOutputAudioDeviceInfoByName ( name );
/*使用默认输入、输出设备*/
//如果开启这段代码,页面上的输入、输出设备选择,就仅仅是个显示了,不具备操作能力。
/*
dev = QQtAudioManager::defaultInputDevice();
devOut = QQtAudioManager::defaultOutputDevice();
*/
2018-02-10 00:32:32 +08:00
//把设备设进manager去
2018-02-10 00:32:32 +08:00
manager.inputDeviceInfo() = dev;
manager.outputDeviceInfo() = devOut;
//这里保证输入、输出使用格式相等 或者 不同
//如果格式不同在mac电脑上本地输入输出设备是可以使用的但是对于连接的语音蓝牙话筒却是不可以使用的原因未知。
//格式相同的时候,实在是太好用啦。
//这个建议默认就相同但是在QQtAudioManager当中并没有直接将其相等处理如果用户在readyRead槽函数里可以更改采样率进行某些特殊处理。一般不需要差异处理的相等就行了。
2018-02-10 16:12:47 +08:00
// 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();
2018-02-10 16:12:47 +08:00
if ( ui->outBit->currentIndex().isValid() )
outBit = ui->outBit->currentIndex().data().toInt();
2018-02-10 16:12:47 +08:00
if ( ui->outChn->currentIndex().isValid() )
outChn = ui->outChn->currentIndex().data().toInt();
2018-02-10 16:12:47 +08:00
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();
2018-02-10 16:12:47 +08:00
pline() << "out prefer" << devOut.preferredFormat().channelCount() << devOut.preferredFormat().sampleRate() <<
devOut.preferredFormat().sampleSize();
2018-02-10 17:40:26 +08:00
pline() << "in" << manager.inputAudioFormat().channelCount() << manager.inputAudioFormat().sampleRate() <<
manager.inputAudioFormat().sampleSize();
pline() << "out" << manager.outputAudioFormat().channelCount() << manager.outputAudioFormat().sampleRate() <<
manager.outputAudioFormat().sampleSize();
2018-02-10 00:32:32 +08:00
manager.startInput();
manager.startOutput();
}
void MainWindow::readyRead()
{
2018-02-10 13:18:08 +08:00
//这里是用户实现,任何用户希望做的事情,都在这里做完。
//可以 录音、保存文件
//可以 直接播放
//可以 混音 +保存 +播放...
//可以 消音
//可以 将pcm转换为其他格式音频
//可以 降噪
//可以 ...
//ptime();//11-12ms 是个10ms timer
QByteArray bytes = manager.readAll();
manager.write ( bytes );
2018-02-10 00:32:32 +08:00
}
void MainWindow::on_pushButton_3_clicked()
{
manager.stopInput();
2018-02-10 17:40:26 +08:00
manager.stopOutput();
}
2018-02-10 13:18:08 +08:00
/*bug:Qt 设置音量会报错退出*/
void MainWindow::on_inHS_valueChanged ( int value )
{
return;
if ( !manager.inputDevice() )
return;
2018-02-12 11:11:09 +08:00
qreal linearVolume;
// qreal linearVolume = QAudio::convertVolume ( value / qreal ( 100.0 ),
// QAudio::LogarithmicVolumeScale,
// QAudio::LinearVolumeScale );
2018-02-10 13:18:08 +08:00
2018-02-12 11:11:09 +08:00
// pline() << "输入音量" << value << linearVolume << qRound ( linearVolume * 100 ) ;
2018-02-10 13:18:08 +08:00
manager.inputManager()->setVolume ( qRound ( linearVolume * 100 ) );
}
/*bug:Qt 设置音量会报错退出*/
void MainWindow::on_outHS_valueChanged ( int value )
{
return;
if ( !manager.outputDevice() )
return;
qreal vol = qreal ( value ) / 100;
pline() << "输出音量" << vol ;
manager.outputManager()->setVolume ( vol );
}
2018-02-10 16:12:47 +08:00
void MainWindow::on_pushButton_4_clicked()
{
manager.inputAudioFormat() = QQtAudioManager::defaultOutputDevice().preferredFormat();
manager.outputAudioFormat() = QQtAudioManager::defaultOutputDevice().preferredFormat();
2018-02-10 17:40:26 +08:00
pline() << "in prefer" << QQtAudioManager::defaultInputDevice().preferredFormat().channelCount() <<
QQtAudioManager::defaultInputDevice().preferredFormat().sampleRate() <<
QQtAudioManager::defaultInputDevice().preferredFormat().sampleSize();
pline() << "out prefer" << QQtAudioManager::defaultOutputDevice().preferredFormat().channelCount() <<
QQtAudioManager::defaultOutputDevice().preferredFormat().sampleRate() <<
QQtAudioManager::defaultOutputDevice().preferredFormat().sampleSize();
pline() << "in" << manager.inputAudioFormat().channelCount() << manager.inputAudioFormat().sampleRate() <<
manager.inputAudioFormat().sampleSize();
pline() << "out" << manager.outputAudioFormat().channelCount() << manager.outputAudioFormat().sampleRate() <<
manager.outputAudioFormat().sampleSize();
2018-02-10 16:12:47 +08:00
manager.startDefaultInput();
manager.startDefaultOutput();
}