C++ 用于通过音量调节从麦克风捕获语音的Api

C++ 用于通过音量调节从麦克风捕获语音的Api,c++,qt,C++,Qt,我试图在qt上创建一个应用程序,通过GSM调制解调器进行语音通话。现在我正在寻找一个可以从micro中捕获声音并能够调节音量的库。Qt的声子具有语音调节功能,但无法从麦克风捕获数据 另一方面,还有QT多媒体,它可以捕获这些数据,但不能调节音量 是否有任何C++的LIB都可以完成这两个任务,并且通过Win Mac Linux? 在输入和输出时,我使用pcm格式,带符号,所以我只需将输入\输出流的字节值乘以一些浮点值来设置音量,然后将数据写入我需要的设备 class VOICEIO_EXPORT V

我试图在qt上创建一个应用程序,通过GSM调制解调器进行语音通话。现在我正在寻找一个可以从micro中捕获声音并能够调节音量的库。Qt的声子具有语音调节功能,但无法从麦克风捕获数据

另一方面,还有QT多媒体,它可以捕获这些数据,但不能调节音量


是否有任何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);
返回结果;
}