#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
muCoDecInit();
//获取输入音频设备名称
QList<QString> deviceListIn;
QList<QAudioDeviceInfo> audioDeviceListIn = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
for(QAudioDeviceInfo devInfo: audioDeviceListIn){
if(devInfo.isNull()){
qWarning()<<"device null";
continue;
}
QString strName = devInfo.deviceName();
if (strName[0] == 65533){
qWarning()<<"invalid device";
continue;
}
//避免回同名的音频设备
if(!deviceListIn.contains(strName)){
deviceListIn.append(strName);
}
}
qInfo()<<"audio input device: size="<<deviceListIn.size()<<", list="<<deviceListIn;
//QAudioDeviceInfo infoIn = audioDeviceListIn.at(2);
QAudioDeviceInfo infoIn =QAudioDeviceInfo::defaultInputDevice();
//获取输出音频设备名称
QList<QString> deviceListOut;
QList<QAudioDeviceInfo> audioDeviceListOut = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
for(QAudioDeviceInfo devInfo: audioDeviceListOut)
{
if (devInfo.isNull()){
qWarning()<<"device null";
continue;
}
QString strName = devInfo.deviceName();
if (strName[0] == 65533){
qWarning()<<"invalid device";
continue;
}
//避免回同名的音频设备
if(!deviceListOut.contains(strName)){
deviceListOut.append(strName);
}
}
qInfo()<<"audio output device: size="<<deviceListOut.size()<<", list="<<deviceListOut;
//QAudioDeviceInfo infoOut = audioDeviceListIn.at(0);
QAudioDeviceInfo infoOut =QAudioDeviceInfo::defaultOutputDevice();
QAudioFormat format;
format.setSampleRate(8000);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
udpsocketreceive = new QUdpSocket(this);
udpsocketreceive->bind(QHostAddress::AnyIPv4, 10004);
connect(udpsocketreceive, SIGNAL(readyRead()), this,
SLOT(readReadSlotReceive()));
output = new QAudioOutput(infoOut, format, this);
output->setVolume(1.0);
outputDevice = output->start();
udpSocketsend = new QUdpSocket(this);
input = new QAudioInput(infoIn, format, this);
input->setVolume(1.0);
inputDevice =input->start(); // input开始读入输入的音频信号,写入QIODevice,这里是inputDevice
connect(inputDevice, SIGNAL(readyRead()), this,
SLOT(onReadyReadSend())); //发送音频给ACP
}
int MainWindow:: findfirstbit(uint32_t bit,uint32_t data)
{
for(int i=0;i<32;i++){
if(i != 0)
data<<=1 ;
if(bit==((data&0x80000000)>>31))
{
return i;
}
}
}
void MainWindow:: muCoDecInit(void)
{
uint32_t uiPCM = 0;
uint32_t uiMu = 0;
uint32_t uiData = 0;
uint32_t uiSign = 0;
uint32_t uiLmbd = 0;
uint16_t uiQuant = 0;
int16_t sTmp = 0;
uint32_t uiAbs = 0;
uint32_t uiSeg = 0;
uint32_t uiOut = 0;
//uint8_t s_aucInt2Mu[uiPCM];
//uint16_t s_ausMu2Int[uiMu];
for(uiPCM=0u; uiPCM<PCM_NUM; ++uiPCM)
{
sTmp = (int16_t)uiPCM;
uiAbs = 132u;
uiAbs += (((uint32_t)abs((int32_t)sTmp) >> 2) << 2);
uiLmbd = findfirstbit(1u, uiAbs);
uiSeg = (24u - findfirstbit(1u, uiAbs)) << 4; // 32bit lmbd閺屻儲澹�1u閸︹暠iabs娑擃厾娈戞担宥囩枂閿涘奔绮犳妯圭秴瀵拷婵锟藉倽绻戦崶鐐扮秴閺佸府绱濋張顏呯叀閸掓媽绻戦崶锟�32.閵嗗倶锟藉倶锟斤拷
uiQuant = (uiAbs >> (25u + 2u - uiLmbd)) & 0x0Fu;
uiOut = uiSeg + uiQuant;
if(uiAbs > 32767u)
{
uiOut = 0x7Fu;
}
if(sTmp < 0)
{
s_aucInt2Mu[uiPCM] = ((uint8_t)uiOut) ^ 0x7Fu;
}
else
{
s_aucInt2Mu[uiPCM] = ((uint8_t)uiOut) ^ 0xFFu;
}
}
for(uiMu=0u; uiMu<MULAW_NUM; ++uiMu)
{
uiData = (uiMu ^ 0xFFu);
uiSign = ((uiData<<24u)>>31u); // 32bit
uiQuant = 132u;
uiQuant+=((uiData<<28u)>>25u);
uiQuant<<=((uiData<<25u)>>29u);
if(1u == uiSign)
{
s_ausMu2Int[uiMu] = (uint16_t)(132u - uiQuant);
}
else
{
s_ausMu2Int[uiMu] = (uint16_t)(uiQuant - 132u);
}
}
for (int i=0;i<20;i++) {
//qDebug()<<"["<<i<<"]"<<"s_aucInt2Mu"<<s_aucInt2Mu[i]<<"s_ausMu2Int"<<s_ausMu2Int[i]<<endl;
}
}
void MainWindow:: mulaw2intVec(uint8_t input[], int16_t output[], int32_t len)
{
int32_t idx = 0;
for (idx = 0; idx<len; ++idx)
{
output[idx] =static_cast<int16_t>(s_ausMu2Int[input[idx]]) ;
}
}
void MainWindow:: int2mulawVec(int16_t input[], uint8_t output[], int32_t len)
{
int32_t idx = 0;
uint16_t temp;
for (idx = 0; idx<len; ++idx)
{
temp =static_cast<uint16_t>(input[idx]);
output[idx] = s_aucInt2Mu[temp];
}
}
void MainWindow::onReadyReadSend() {
memset(&buff, 0, sizeof(buff));
//读取音频vpsend
inputDevice->read(reinterpret_cast<char*>(buff) , sizeof(buff));
for (int i = 0; i<320; i++)
{
int16_t result =static_cast<int16_t>((buff[i * 2 + 1] << 8) + (buff[i * 2])) ;
int2mlawinput[i] = result;
}
int2mulawVec(int2mlawinput, int2mlawoutput, 320);
for (int i = 0; i<320; i++)
{
data[i] = int2mlawoutput[i];
}
QHostAddress destaddr;
destaddr.setAddress("192.168.1.120");
udpSocketsend->writeDatagram(reinterpret_cast<const char *>(data), sizeof(data), destaddr, 10005);
}
MainWindow::~MainWindow()
{
udpSocketsend->abort();
udpsocketreceive->abort();
delete udpSocketsend;
delete udpsocketreceive;
delete ui;
}
void MainWindow::readReadSlotReceive() {
while (udpsocketreceive->hasPendingDatagrams()) {
QHostAddress senderip;
quint16 senderport;
memset(&data, 0, sizeof(data));
udpsocketreceive->readDatagram(reinterpret_cast<char *>(data) , sizeof(data), &senderip,
&senderport);
mulaw2intVec(data, mlaw2intoutput, 320);
for (int i = 0; i<320; i++)
{
short audiodata = mlaw2intoutput[i];
buff[i * 2 + 1] = static_cast<uint8_t>((audiodata & 0xff00) >> 8);
buff[i * 2] = static_cast<uint8_t>(audiodata & 0x00ff);
}
qDebug() << "read ip" << senderip;
qDebug() << "read port" << senderport;
outputDevice->write(reinterpret_cast<char*>(buff), sizeof (buff));
//qDebug()<<"data"<<(char*)vp.data;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
通过udp实现两台电脑之间进行通话功能
共414个文件
idx:353个
tlog:9个
h:4个
需积分: 16 0 下载量 8 浏览量
2022-12-28
15:20:42
上传
评论
收藏 1.98MB RAR 举报
温馨提示
通过udp实现两台电脑之间进行通话功能
资源推荐
资源详情
资源评论
收起资源包目录
通过udp实现两台电脑之间进行通话功能 (414个子文件)
AudioReceive.pro.user.4.10-pre1 35KB
AudioReceive.pro.user.6b9e0ba.4.10-pre1 24KB
AudioReceive.pro.user.7971ad0.22 25KB
AudioReceive.pro.user.22 19KB
AudioReceive.pro.user.6bae19d.22 19KB
AudioSend.pro.user.6bae19d.22 18KB
AudioReceive.pro.user.6b9e0ba 24KB
mainwindow.cpp 7KB
mainwindow.cpp 7KB
main.cpp 183B
main.cpp 183B
Browse.VC.db 256KB
Browse.VC.db 256KB
Makefile.Debug 48KB
Makefile.Debug 48KB
AudioSend.pro.user.f5b751e 19KB
AudioSend.vcxproj.filters 3KB
AudioReceive.vcxproj.filters 2KB
ui_mainwindow.h 2KB
ui_mainwindow.h 2KB
mainwindow.h 1KB
mainwindow.h 1KB
qnamespace.h.FF7436995C136E06.idx 149KB
qmetatype.h.EEF954C908C02C2D.idx 134KB
qhash.h.7AC01F359F6B298F.idx 110KB
stl_algo.h.5FCBF7AD2C39CA69.idx 106KB
qstring.h.E36D13C20F86216A.idx 95KB
qlocale.h.5E4A3014BDE65DFF.idx 83KB
qvarlengtharray.h.E14B39996F018FBC.idx 82KB
basic_string.h.3EA6F3E3C03CF711.idx 69KB
stl_tree.h.6DA6C35CACB0A85E.idx 67KB
qmap.h.FE8BD817E26AA762.idx 67KB
qflags.h.1482E244787FEFEB.idx 62KB
qlist.h.0F076588F1CBADA7.idx 61KB
qcontiguouscache.h.C0E1199E0E68546B.idx 60KB
limits.ED72BFAE94F0CAA1.idx 57KB
qdebug.h.5A584BDA748F94E9.idx 45KB
wchar.h.8A9B623EE88F2D70.idx 44KB
type_traits.EF1DD7E3AB38D0D3.idx 44KB
basic_string.tcc.4EF75573B7A58625.idx 42KB
qchar.h.DFA7BBD693DF3E84.idx 41KB
qwidget.h.7991773CBD0ADFC6.idx 41KB
qsharedpointer_impl.h.ACA297B6F56222AB.idx 39KB
qbytearray.h.8FEC1DDC787DFC27.idx 38KB
qcolor.h.833C525BA1383BF7.idx 37KB
atomic.3D5D6F43342AFCB2.idx 36KB
stl_algobase.h.1FC215A54552113D.idx 36KB
stl_list.h.4F732471E14F1E13.idx 36KB
stl_function.h.7AA784877DC3C96E.idx 35KB
qvariant.h.1043CA36834FF652.idx 34KB
stdlib.h.8D1B849F925680B2.idx 34KB
qrect.h.D126FEF37764A1F6.idx 33KB
cmath.A0A08F382EA62983.idx 33KB
functional.54F2E4FEBE22653C.idx 33KB
qmetacontainer.h.F4A2AE14B835BF2B.idx 32KB
numeric.D1D20A2639EF01AE.idx 32KB
chrono.AB49B1B7797201CB.idx 32KB
shared_ptr_base.h.8B9E1B90955C5A83.idx 32KB
qtypeinfo.h.B11162CF1D97DC8D.idx 31KB
qbrush.h.B7E2EFDD65E11626.idx 29KB
list.tcc.F065556DD02680CA.idx 29KB
stl_map.h.169186F18F6403BE.idx 28KB
specfun.h.504AD9D0B2270980.idx 28KB
tuple.2FC5ACF5359CC6D4.idx 28KB
unordered_map.h.11671F6AA00D664F.idx 27KB
qglobal.h.A7EDC9CF6953AF33.idx 27KB
qhashfunctions.h.295DBF290DC5A843.idx 26KB
pthread.h.6E22B1265CAC4982.idx 26KB
variant.D45F3D6257C9556D.idx 25KB
ratio.B3DEDD7141BA261D.idx 25KB
stl_iterator.h.02F4896DC76FA048.idx 25KB
unique_ptr.h.1E0FA4B852FA8CF1.idx 25KB
qarraydataops.h.B6A0DDF9509D0939.idx 24KB
string_view.163187C18809B48B.idx 24KB
qset.h.5055D6D9BD12F16D.idx 24KB
qstringview.h.D020873F5BE65CAE.idx 23KB
math.h.D3FDF466545391C1.idx 23KB
qobjectdefs_impl.h.7C569883D8B7D120.idx 23KB
stl_vector.h.6760409A3CC06C3D.idx 22KB
qdatastream.h.2E13EE8DA2E3974C.idx 22KB
glue_algorithm_defs.h.2782462FE805E0DE.idx 22KB
qobject.h.1B4D1012053F03E1.idx 22KB
stl_bvector.h.6D71D49D9B7DFC37.idx 21KB
qcoreevent.h.1BDCDCC34A620D1E.idx 21KB
hypergeometric.tcc.EEF1326F1BE89202.idx 21KB
shared_ptr.h.68992A1576396FB9.idx 20KB
vector.tcc.0244E487C66A7E45.idx 20KB
qtmetamacros.h.C98C181C60C840AA.idx 20KB
qimage.h.904467EFFF22D601.idx 19KB
qmargins.h.571D1E3E379D4EBC.idx 19KB
stdio.h.38586BCA99051192.idx 19KB
stl_multimap.h.6CEB5291DF5FE3CA.idx 18KB
stl_numeric.h.9CBFE6ED9B867060.idx 18KB
qstringtokenizer.h.CEEAE7D8B75EDCFE.idx 18KB
string.h.DD656C88A98DFFA0.idx 18KB
qpixelformat.h.80314A185901928A.idx 17KB
algorithmfwd.h.B818E34A708CBED6.idx 17KB
qshareddata.h.CC1C07167E476AEE.idx 17KB
optional.38EBC242B4B3B6A4.idx 17KB
ios_base.h.5D8E18D464E980AD.idx 17KB
共 414 条
- 1
- 2
- 3
- 4
- 5
资源评论
逆风微笑的程序猿
- 粉丝: 31
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功