• 5260阅读
  • 7回复

线程突然不运作 [复制链接]

上一主题 下一主题
离线om181225
 

只看楼主 倒序阅读 楼主  发表于: 2015-02-03
程序通过开一个对音频口进行数据采集,用乒乓缓存的方法对接收的数据进行处理,每次采集大约半个小时之后不在采集了,程序也不显示错误,也不卡
离线jnny_cn

只看该作者 1楼 发表于: 2015-02-03
上代码,这么说也帮不了你什么
离线om181225

只看该作者 2楼 发表于: 2015-02-04
回 jnny_cn 的帖子
jnny_cn:上代码,这么说也帮不了你什么 (2015-02-03 23:07) 

#ifndef LISTENINGTHREAD_H
#define LISTENINGTHREAD_H

#include <QThread>
#include <QAudioInput>
#include <QIODevice>
#include <QString>
#include <QByteArray>
#include <QTimer>

#define SAMPLE_RATE     96000       //采样率
#define CHANNEL_COUNT    2         //采样通道
#define SAMPLE_SIZE        16          //采样位数
#define RECORDING_TIME  50          //每次采样毫秒数
#define TOTAL_SIZE  384000      //缓存区总大小 Byte
#define USED_SIZE   96000       //缓存区使用大小 Byte

class listeningThread : public QThread
{
    Q_OBJECT
public:
    explicit listeningThread(QObject *parent = 0);
    ~listeningThread();
    char *buf0Addr() { return buf0->data(); }
    char *buf1Addr() { return buf1->data(); }
    qint64 buf0Size() { return bytesReaded0; }
    qint64 buf1Size() { return bytesReaded1; }
    bool listeningBufFlag() { return bufFlag; }

protected:
    void run();

signals:
    void addLog(QString newLog, int flag);
    void buf0Full(char *buf0Address, qint64 buf0Size);
    void buf1Full(char *buf1Address, qint64 buf1Size);

public slots:
    void readAudioData();

private:
    QAudioInput *audioInput;
    QIODevice *ioDeviceAudioIn;
    QTimer *timer;

    QByteArray *buf0;
    QByteArray *buf1;
    bool bufFlag;
    qint64 bytesReaded0;
    qint64 bytesReaded1;
};

#endif // LISTENINGTHREAD_H




#include "listeningthread.h"

#include <QDebug>
#include <QTime>

listeningThread::listeningThread(QObject *parent) :
    QThread(parent)
{
}

listeningThread::~listeningThread()
{
    audioInput->stop();

    delete audioInput;
    delete ioDeviceAudioIn;
    delete timer;
    delete buf0;
    delete buf1;
}

void listeningThread::run()
{
    buf0 = new QByteArray();
    buf1 = new QByteArray();
    buf0->resize(TOTAL_SIZE);
    buf1->resize(TOTAL_SIZE);
    bufFlag = false;
    bytesReaded0 = 0;
    bytesReaded1 = 0;

    QAudioFormat format;
    format.setSampleRate(SAMPLE_RATE);
    format.setChannelCount(CHANNEL_COUNT);
    format.setSampleSize(SAMPLE_SIZE);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::SignedInt);
    QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
    if (!info.isFormatSupported(format))
    {
        emit addLog("Listening default format not supported!",0);
        return;
    }

    audioInput = new QAudioInput(format);       //read audio data
    audioInput->setBufferSize(SAMPLE_RATE / 1000 * SAMPLE_SIZE / 8 * CHANNEL_COUNT * RECORDING_TIME * 3);

    timer = new QTimer();
    connect(timer,SIGNAL(timeout()),this,SLOT(readAudioData()));

    ioDeviceAudioIn = audioInput->start();
    timer->start(RECORDING_TIME);

    emit addLog("监听线程打开", 0);

    exec();
}

void listeningThread::readAudioData()
{
    while(audioInput->bytesReady())
    {
//        qDebug()<<audioInput->bytesReady()<<' '<<QTime::currentTime().toString("hh:mm:ss.zzz");
        qint64 bytesReady = audioInput->bytesReady();
        if(bufFlag)
        {
            bytesReaded1 += ioDeviceAudioIn->read((buf1->data() + bytesReaded1), bytesReady);

            if(bytesReaded1 >= USED_SIZE)
            {
                emit buf1Full(buf1->data(), bytesReaded1);
                bytesReaded0 = 0;
                bufFlag = !bufFlag;
//                qDebug()<<"buf0"<<' '<<QTime::currentTime().toString("hh:mm:ss.zzz");
            }
        }
        else
        {
            bytesReaded0 += ioDeviceAudioIn->read((buf0->data() + bytesReaded0), bytesReady);

            if(bytesReaded0 >= USED_SIZE)
            {
                emit buf0Full(buf0->data(), bytesReaded0);
                bytesReaded1 = 0;
                bufFlag = !bufFlag;
//                qDebug()<<"buf1"<<' '<<QTime::currentTime().toString("hh:mm:ss.zzz");
            }
        }
    }
}


运行30分钟左右进入readAudioData()函数便不在执行了
离线om181225

只看该作者 3楼 发表于: 2015-02-04
回 jnny_cn 的帖子
jnny_cn:上代码,这么说也帮不了你什么 (2015-02-03 23:07) 

在电脑上跑好使,但移植到arm上就30分钟不行了
离线jnny_cn

只看该作者 4楼 发表于: 2015-02-04
既然电脑中正常,是否有办法测试arm中的音频硬件或是底层软件驱动的问题呢?

我想你电脑和arm应该是不同的硬件吧?
离线om181225

只看该作者 5楼 发表于: 2015-02-04
回 jnny_cn 的帖子
jnny_cn:既然电脑中正常,是否有办法测试arm中的音频硬件或是底层软件驱动的问题呢?
我想你电脑和arm应该是不同的硬件吧? (2015-02-04 09:46) 

这问题折磨一个星期了  现在解决了 将readAudioData()函数里面的bufFlag = !bufFlag 写成
bufFlag = false bufFlag = true就好使了 比较无语
离线jnny_cn

只看该作者 6楼 发表于: 2015-02-04
回 om181225 的帖子
om181225:这问题折磨一个星期了  现在解决了 将readAudioData()函数里面的bufFlag = !bufFlag 写成
bufFlag = false bufFlag = true就好使了 比较无语 (2015-02-04 14:50) 

恭喜解决
离线coswh

只看该作者 7楼 发表于: 2015-03-04
bufFlag = !bufFlag; 好像我也遇到过pc可以,到arm就不行了
快速回复
限100 字节
 
上一个 下一个