QAudioInput stops send data in tabWidged when tab changed

68 Views Asked by At

All! I have some application with 3 tabs, one tab initialized QWidget from other tab. I start QAudioInput in constructor(read to memory, I don't need file) - it starts works. But when I change tab to my widget, data stops and audioInput has status isActive still. I have changed and minimized sources. It is a cross-compilation for ARM Linux platform. Now it is works usiallu, but few changes active tab crash stream.

int main(int argc, char *argv[])
{
    QApplication myapp(argc, argv);
    Widget wid;
    wid.show();
    return myapp.exec();
}
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // Default widget in new tab
    wMetod = new Vnimi(this);//this
    ui->tabWidget->insertTab(1, wMetod, "Empty"); // Set Tab's name

    ui->pButton_Vnimi->setChecked(true);
    /*QButtonGroup **/
    grMetod = new QButtonGroup(this);
    grMetod->addButton(ui->pButton_Vnimi );
    grMetod->addButton(ui->pButton_ExpVibro);
    grMetod->setExclusive(true);
    connect(grMetod, static_cast<void(QButtonGroup::*)(QAbstractButton *)>(&QButtonGroup::buttonPressed),
        [=](QAbstractButton *button){ metChanged(button); });

    ui->tabWidget->setCurrentIndex(0);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::metChanged(QAbstractButton *button)
{
    /* switch for strings */
    if( button->objectName() =="pButton_Empty" ) {
        ui->tabWidget->removeTab(1);
        wMetod->disconnect(); delete wMetod;
        wMetod = new Vnimi(this);//this
        ui->tabWidget->insertTab(1, wMetod, "Empty"); // Set Tab's name
    }else if( button->objectName() =="pButton_Input" ) {
        ui->tabWidget->removeTab(1);
        wMetod->disconnect(); delete wMetod;
        wMetod = new VibrExpr(this);//this
        ui->tabWidget->insertTab(1, wMetod, "Input"); // Set Tab's name
    }else {
        qDebug() << "Unknow method!";
    }
    qDebug() << button->objectName() << " pressed";
}
VibrExpr::VibrExpr(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::VibrExpr)
{
    ui->setupUi(this);
    ui->lb_level->setText( QString().number(minLevel) );

    QAudioFormat frmt;
    frmt.setCodec( "audio/pcm"), frmt.setChannelCount( 2);
    frmt.setSampleRate( 44100), frmt.setSampleType( QAudioFormat::SignedInt);
    frmt.setSampleSize( 16);

    rawSrc = new QAudioInput(QAudioDeviceInfo::defaultInputDevice(), frmt, this);
    rawSrc->setNotifyInterval(250);
    connect(rawSrc, SIGNAL(notify()), this, SLOT(slot()));
    connect(rawSrc, SIGNAL(stateChanged(QAudio::State)), this,  SLOT(iStateChanged(QAudio::State)));

    buff = new QBuffer(this);
    buff->open(QBuffer::ReadWrite);
    connect(buff, SIGNAL(readyRead()), this, SLOT(newData()) );

    rawSrc->start(buff);

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this,  SLOT(timSlot()) );
    timer->start(1000);

    qDebug() << "Created";
}

void VibrExpr::timSlot()
{
    int sbVal = ui->lb_level->text().toInt();
    if(sbVal < -6 ) {
        sbVal += 1;
    }
    if(buff != nullptr)  \
    if(buff->isOpen() && sbVal >= -10) {
        qDebug() << "Sz " << buff->size();
        rawSrc->stop();
        buff->close();
        qDebug() << " Input closed";
    }
    ui->lb_level->setText( QString().number(sbVal));
    if(rawSrc != nullptr)  qDebug() << "iStat " << rawSrc->state();
}

void VibrExpr::newData(void)
{
    int k = buff->size();
    QByteArray qba = buff->read(k);
    buff->seek(0);
    buff->buffer().remove(0, k);
    qDebug() << "n=" << k;
}

void VibrExpr::slot(void)
{
    qDebug() << "USec:" << rawSrc->processedUSecs() ;
}

void VibrExpr::iStateChanged(QAudio::State state)
{
    qDebug() << "Now state: " << state;
}
0

There are 0 best solutions below