C++ 用于通过音量调节从麦克风捕获语音的Api
我试图在qt上创建一个应用程序,通过GSM调制解调器进行语音通话。现在我正在寻找一个可以从micro中捕获声音并能够调节音量的库。Qt的声子具有语音调节功能,但无法从麦克风捕获数据 另一方面,还有QT多媒体,它可以捕获这些数据,但不能调节音量C++ 用于通过音量调节从麦克风捕获语音的Api,c++,qt,C++,Qt,我试图在qt上创建一个应用程序,通过GSM调制解调器进行语音通话。现在我正在寻找一个可以从micro中捕获声音并能够调节音量的库。Qt的声子具有语音调节功能,但无法从麦克风捕获数据 另一方面,还有QT多媒体,它可以捕获这些数据,但不能调节音量 是否有任何C++的LIB都可以完成这两个任务,并且通过Win Mac Linux? 在输入和输出时,我使用pcm格式,带符号,所以我只需将输入\输出流的字节值乘以一些浮点值来设置音量,然后将数据写入我需要的设备 class VOICEIO_EXPORT V
是否有任何C++的LIB都可以完成这两个任务,并且通过Win Mac Linux? 在输入和输出时,我使用pcm格式,带符号,所以我只需将输入\输出流的字节值乘以一些浮点值来设置音量,然后将数据写入我需要的设备
class VOICEIO_EXPORT VoiceIOAdapter : public QIODevice
{
Q_OBJECT
public:
VoiceIOAdapter(QObject *parent,QIODevice* dev);
VoiceIOAdapter(QObject *parent);
~VoiceIOAdapter();
void setUnderlyingDevice(QIODevice* dev);
QIODevice* getUnderlyingDevice() const;
... /*some qiodevice virtual functions reimplemented*/
...
float getOutVolume()const;
float getInVolume() const;
public slots:
void setOutVolume(float);
void setInVolume(float);
protected:
QIODevice* underlyingDevice;
virtual qint64 readData ( char * data, qint64 maxSize );
virtual qint64 writeData ( const char * data, qint64 maxSize );
void applyVolume(float value, QByteArray& input);
float outVolume;//1
float inVolume;//1
};
void VoiceIOAdapter::applyVolume(float value, QByteArray& input)
{
Q_ASSERT(!(input.size()%2)); //SHORT,Signed,LE
qint16* data=reinterpret_cast<qint16*>(input.data());
qint32 tmp;
for(int i=0;i<input.size()/2;i++)
{
tmp=qint32(float(data[i])*value);
if(tmp>std::numeric_limits<qint16>::max())
{
tmp=std::numeric_limits<qint16>::max();
}
else if (tmp<std::numeric_limits<qint16>::min())
{
tmp=std::numeric_limits<qint16>::min();
}
data[i]=tmp;
}
}
qint64 VoiceIOAdapter::readData ( char * data, qint64 maxSize )
{
if(!underlyingDevice)
{
return -1;
}
QByteArray decoded(maxSize ,0);
qint64 result=underlyingDevice->read(decoded.data(),maxSize);
if(result>0)
{
decoded.resize(result);
applyVolume(inVolume,decoded);
memcpy(data,decoded.data(),decoded.size());
}
return result;
}
qint64 VoiceIOAdapter::writeData ( const char * data, qint64 maxSize )
{
if(!underlyingDevice)
{
return -1;
}
QByteArray encoded(data,maxSize);
applyVolume(outVolume,encoded);
qint64 result=underlyingDevice->write(encoded.data(),maxSize );
return result;
}
class VOICEIO\u导出VoiceIOAdapter:公共QIODevice
{
Q_对象
公众:
VoiceIOAdapter(QObject*parent,QIODevice*dev);
VoiceIOAdapter(QObject*父对象);
~VoiceIOAdapter();
无效设置下垫装置(QIODevice*dev);
QIODevice*GetUnderlineDevice()常量;
…/*重新实现了一些qiodevice虚拟函数*/
...
float getOutVolume()常量;
float getInVolume()常量;
公众时段:
空隙放线体积(浮动);
无效设置发票(浮动);
受保护的:
QIODevice*下垫装置;
虚拟qint64读取数据(字符*数据,qint64最大大小);
虚拟qint64写入数据(常量字符*数据,qint64最大大小);
void applyVolume(浮点值、QByteArray和输入);
float outVolume;//1
float inVolume;//1
};
void VoiceIOAdapter::applyVolume(浮点值、QByteArray和输入)
{
Q_ASSERT(!(input.size()%2));//SHORT,Signed,LE
qint16*data=reinterpret_cast(input.data());
秦T32 tmp;
对于(int i=0;istd::numeric_limits::max())
{
tmp=std::数值限制::最大值();
}
else if(tmpread(decoded.data(),maxSize);
如果(结果>0)
{
解码。调整大小(结果);
applyVolume(发票,已解码);
memcpy(data,decoded.data(),decoded.size());
}
返回结果;
}
qint64 VoiceIOAdapter::writeData(常量字符*数据,qint64最大大小)
{
if(!underyingdevice)
{
返回-1;
}
QByteArray编码(数据,最大大小);
applyVolume(outVolume,编码);
qint64结果=underlyingDevice->write(encoded.data(),maxSize);
返回结果;
}