Skip to content

Commit

Permalink
音频线程
Browse files Browse the repository at this point in the history
  • Loading branch information
muleimulei committed Jul 21, 2021
1 parent b0e4e4a commit b4db38f
Show file tree
Hide file tree
Showing 8 changed files with 298 additions and 12 deletions.
135 changes: 135 additions & 0 deletions AudioInput.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
#include "AudioInput.h"
#include "netheader.h"
#include <QAudioFormat>
#include <QDebug>
#include <QThread>

extern QUEUE_SEND queue_send;
extern QUEUE_RECV queue_recv;

AudioInput::AudioInput(QObject *parent)
: QObject(parent)
{
recvbuf = (char*)malloc(MB * 2);
QAudioFormat format;
//set format
format.setSampleRate(8000);
format.setChannelCount(1);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);

QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format))
{
qWarning() << "Default format not supported, trying to use the nearest.";
format = info.nearestFormat(format);
}
audio = new QAudioInput(format, this);
connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State)));

}

AudioInput::~AudioInput()
{
delete audio;
}

void AudioInput::startCollect()
{
inputdevice = audio->start();
connect(inputdevice, SIGNAL(readyRead()), this, SLOT(onreadyRead()));
}
void AudioInput::stopCollect()
{
disconnect(this, SLOT(onreadyRead()));
audio->stop();
}
void AudioInput::onreadyRead()
{
static int num = 0, totallen = 0;
int len = inputdevice->read(recvbuf + totallen, 2 * MB - totallen);
if (num < 10)
{
totallen += len;
num++;
return;
}
totallen = 0;
num = 0;
MESG* msg = (MESG*)malloc(sizeof(MESG));
if (msg == nullptr)
{
qWarning() << __LINE__ << "malloc fail";
}
else
{
msg->msg_type = AUDIO_SEND;
msg->data = (uchar*)malloc(len+1);
if (msg->data == nullptr)
{
qWarning() << "malloc mesg.data fail";
}
else
{
memset(msg->data, 0, len + 1);
memcpy_s(msg->data, len + 1, recvbuf, len);
queue_recv.push_msg(msg);
}
}
}

QString AudioInput::errorString()
{
if (audio->error() == QAudio::OpenError)
{
return QString("An error occurred opening the audio device").toUtf8();
}
else if (audio->error() == QAudio::IOError)
{
return QString("An error occurred during read/write of audio device").toUtf8();
}
else if (audio->error() == QAudio::UnderrunError)
{
return QString("Audio data is not being fed to the audio device at a fast enough rate").toUtf8();
}
else if (audio->error() == QAudio::FatalError)
{
return QString("A non-recoverable error has occurred, the audio device is not usable at this time.");
}
else
{
return QString("No errors have occurred").toUtf8();
}
}


void AudioInput::handleStateChanged(QAudio::State newState)
{
switch (newState)
{
case QAudio::StoppedState:
if (audio->error() != QAudio::NoError)
{
stopCollect();
emit audioinputerror(errorString());
}
else
{
qWarning() << "stop recording";
}
break;
case QAudio::ActiveState:
//start recording
qWarning() << "start recording";
break;
default:
//
break;
}
}
void AudioInput::setVolumn(int v)
{
audio->setVolume(v / 100.0);
}
26 changes: 26 additions & 0 deletions AudioInput.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#pragma once

#include <QObject>
#include <QAudioInput>
#include <QIODevice>
class AudioInput : public QObject
{
Q_OBJECT
private:
QAudioInput *audio;
QIODevice* inputdevice;
char* recvbuf;
public:
AudioInput(QObject *par = 0);
~AudioInput();
private slots:
void onreadyRead();
void handleStateChanged(QAudio::State);
QString errorString();
void setVolumn(int);
public slots:
void startCollect();
void stopCollect();
signals:
void audioinputerror(QString);
};
2 changes: 2 additions & 0 deletions CloudMeeting.pro
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
AudioInput.cpp \
hintdialog.cpp \
main.cpp \
mytcpsocket.cpp \
Expand All @@ -30,6 +31,7 @@ SOURCES += \
widget.cpp

HEADERS += \
AudioInput.h \
hintdialog.h \
mytcpsocket.h \
myvideosurface.h \
Expand Down
3 changes: 2 additions & 1 deletion main.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#include <QApplication>
#include "widget.h"
#include "screen.h"

#include <QTextCodec>
int main(int argc, char* argv[])
{
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));
QApplication app(argc, argv);
Screen::init();

Expand Down
18 changes: 18 additions & 0 deletions netheader.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,24 @@
#ifndef WAITSECONDS
#define WAITSECONDS 2
#endif

#ifndef OPENVIDEO
#define OPENVIDEO "打开视频"
#endif

#ifndef CLOSEVIDEO
#define CLOSEVIDEO "关闭视频"
#endif

#ifndef OPENAUDIO
#define OPENAUDIO "打开音频"
#endif

#ifndef CLOSEAUDIO
#define CLOSEAUDIO "关闭音频"
#endif


enum MSG_TYPE
{
IMG_SEND = 0,
Expand Down
56 changes: 52 additions & 4 deletions widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <QMessageBox>
#include <QScrollBar>
#include <QHostAddress>
#include <QTextCodec>
QRect Widget::pos = QRect(-1, -1, -1, -1);

Widget::Widget(QWidget *parent)
Expand All @@ -32,13 +33,16 @@ Widget::Widget(QWidget *parent)

ui->setupUi(this);

ui->openAudio->setText(QString(OPENAUDIO).toUtf8());
ui->openVedio->setText(QString(OPENVIDEO).toUtf8());

this->setGeometry(Widget::pos);
this->setMinimumSize(QSize(Widget::pos.width() * 0.7, Widget::pos.height() * 0.7));
this->setMaximumSize(QSize(Widget::pos.width(), Widget::pos.height()));
ui->exitmeetBtn->setDisabled(true);
ui->joinmeetBtn->setDisabled(true);
ui->createmeetBtn->setDisabled(true);
ui->openAudio->setDisabled(true);
//ui->openAudio->setDisabled(true);
ui->openVedio->setDisabled(true);
//ui->openVedio->setDisabled(true);
mainip = 0; //主屏幕显示的用户IP图像
Expand Down Expand Up @@ -96,8 +100,17 @@ Widget::Widget(QWidget *parent)
_camera->setViewfinder(_myvideosurface);
_camera->setCaptureMode(QCamera::CaptureStillImage);



//音频
_ainput = new AudioInput();
_ainputThread = new QThread();
_ainput->moveToThread(_ainputThread);
_ainputThread->start();

connect(this, SIGNAL(startAudio()), _ainput, SLOT(startCollect()));
connect(this, SIGNAL(stopAudio()), _ainput, SLOT(stopCollect()));
connect(_ainput, SIGNAL(audioinputerror(QString)), this, SLOT(audioError(QString)));
connect(this, SIGNAL(volumnChange(int)), _ainput, SLOT(setVolumn(int)));

//设置滚动条
ui->scrollArea->verticalScrollBar()->setStyleSheet("QScrollBar:vertical"
"{"
Expand Down Expand Up @@ -225,7 +238,12 @@ Widget::~Widget()
_sendText->stopImmediately();
_sendText->wait();
}


if (_ainputThread->isRunning())
{
_ainputThread->quit();
_ainputThread->wait();
}

delete ui;
}
Expand Down Expand Up @@ -316,8 +334,28 @@ void Widget::on_openVedio_clicked()
}
}


void Widget::on_openAudio_clicked()
{
if (ui->openAudio->text().toUtf8() == QString(OPENAUDIO).toUtf8())
{
emit startAudio();
ui->openAudio->setText(QString(CLOSEAUDIO).toUtf8());
}
else if(ui->openAudio->text().toUtf8() == QString(CLOSEAUDIO).toUtf8())
{
emit stopAudio();
ui->openAudio->setText(QString(OPENAUDIO).toUtf8());
}
}

void Widget::closeImg(quint32 ip)
{
if (!partner.contains(ip))
{
qDebug() << "close img error";
return;
}
Partner * p = partner[ip];
p->setpic(QImage(":/myImage/1.jpg"));

Expand Down Expand Up @@ -375,6 +413,10 @@ void Widget::cameraError(QCamera::Error)
QMessageBox::warning(this, "Camera error", _camera->errorString() , QMessageBox::Yes, QMessageBox::Yes);
}

void Widget::audioError(QString err)
{
QMessageBox::warning(this, "Audio error", err, QMessageBox::Yes);
}

void Widget::datasolve(MESG *msg)
{
Expand Down Expand Up @@ -605,3 +647,9 @@ void Widget::on_joinmeetBtn_clicked()
emit PushText(JOIN_MEETING, roomNo);
}
}

void Widget::on_horizontalSlider_valueChanged(int value)
{
emit volumnChange(value);
}

12 changes: 12 additions & 0 deletions widget.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifndef WIDGET_H
#define WIDGET_H

#include "AudioInput.h"
#include <QWidget>
#include <QVideoFrame>
#include <QTcpSocket>
Expand Down Expand Up @@ -50,6 +51,10 @@ class Widget : public QWidget
void removePartner(quint32);
void clearPartner(); //退出会议,或者会议结束
void closeImg(quint32); //根据IP重置图像

//音频
AudioInput* _ainput;
QThread* _ainputThread;
public:
Widget(QWidget *parent = nullptr);
~Widget();
Expand All @@ -59,17 +64,24 @@ private slots:
void on_exitmeetBtn_clicked();

void on_openVedio_clicked();
void on_openAudio_clicked();
void on_connServer_clicked();
void cameraError(QCamera::Error);
void audioError(QString);
// void mytcperror(QAbstractSocket::SocketError);
void datasolve(MESG *);
void recvip(quint32);
void cameraImageCapture(QVideoFrame frame);
void on_joinmeetBtn_clicked();

void on_horizontalSlider_valueChanged(int value);

signals:
void pushImg(QImage);
void PushText(MSG_TYPE, QString = "");
void stopAudio();
void startAudio();
void volumnChange(int);
private:
Ui::Widget *ui;
};
Expand Down
Loading

0 comments on commit b4db38f

Please sign in to comment.