60 lines
1.2 KiB
C++
60 lines
1.2 KiB
C++
#include "speakersensor.h"
|
|
|
|
#include <QDebug>
|
|
|
|
SpeakerSensorSource::SpeakerSensorSource(QString name, QObject *parent) : QObject(parent), name_(name)
|
|
{
|
|
silenceCount = 0;
|
|
}
|
|
|
|
SpeakerSensorSource::~SpeakerSensorSource()
|
|
{
|
|
abort();
|
|
}
|
|
|
|
void SpeakerSensorSource::run()
|
|
{
|
|
abort();
|
|
arecord.start( "arecord", {"--disable-softvol", "-r", "8000", "-D", "front", "-"});
|
|
|
|
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
|
|
timer.setInterval(500);
|
|
timer.start();
|
|
|
|
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 1, name_));
|
|
}
|
|
|
|
|
|
void SpeakerSensorSource::abort()
|
|
{
|
|
if(arecord.state() == QProcess::Running)arecord.close();
|
|
if(timer.isActive())timer.stop();
|
|
}
|
|
|
|
void SpeakerSensorSource::doTick()
|
|
{
|
|
if(arecord.state() == QProcess::Running)
|
|
{
|
|
QByteArray buffer = arecord.readAllStandardOutput();
|
|
//qDebug()<<(int16_t)buffer[0];
|
|
for(long i = 0; i < buffer.size(); i++)
|
|
{
|
|
if((int16_t)buffer.at(i) != -128)
|
|
{
|
|
silenceCount = 0;
|
|
}
|
|
}
|
|
if(silenceCount > 40 && state)
|
|
{
|
|
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 0, name_));
|
|
state = false;
|
|
}
|
|
else if(silenceCount == 0 && !state)
|
|
{
|
|
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 1, name_));
|
|
state = true;
|
|
}
|
|
silenceCount++;
|
|
}
|
|
}
|