revert to arecord

This commit is contained in:
IMback
2017-12-30 21:07:30 +01:00
parent 2e79a898e8
commit d40974a8e6
2 changed files with 13 additions and 62 deletions

View File

@ -1,63 +1,19 @@
#include "ampmanager.h" #include "ampmanager.h"
AmpManager::AmpManager(Microcontroller *micro, int relayNumber, QAudioDeviceInfo device, QObject *parent) : QObject(parent), _micro(micro), _relayNumber(relayNumber) AmpManager::AmpManager(Microcontroller *micro, int relayNumber, QObject *parent) : QObject(parent), _micro(micro), _relayNumber(relayNumber)
{ {
/* Open PCM device for recording (capture). */ silenceCount = 0;
rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_CAPTURE, 0);
if (rc < 0) {
fprintf(stderr, "unable to open pcm device: %s\n", snd_strerror(rc));
exit(1);
}
/* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(&params);
/* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params);
/* Set the desired hardware parameters. */
/* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
/* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);
s
/* One channel (mono) */
snd_pcm_hw_params_set_channels(handle, params, 1);
/* 16000 bits/second sampling rate */
val = 16000;
snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir);
/* Set period size to 2048 frames. */
frames = 2048;
snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir);
/* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < 0) {
fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc));
exit(1);
}
/* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(params, &frames, &dir);
size = frames * 2; /* 2 bytes/sample, 1 channels */
char* buffer = new char[size]();
} }
AmpManager::~AmpManager() AmpManager::~AmpManager()
{ {
abort(); abort();
snd_pcm_drain(handle);
snd_pcm_close(handle);
} }
void AmpManager::run() void AmpManager::run()
{ {
abort(); abort();
_ioDevice = _audioDevice->start(); arecord.start( "arecord -D front -" );
loop.reset(new QEventLoop); loop.reset(new QEventLoop);
QTimer timer; QTimer timer;
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick())); connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
@ -73,17 +29,18 @@ void AmpManager::run()
void AmpManager::abort() void AmpManager::abort()
{ {
if (!loop.isNull())loop->quit(); if (!loop.isNull()){
if(_audioDevice->error() == 0)_audioDevice->stop(); loop->quit();
if(_ioDevice != nullptr)delete _ioDevice; }
if(arecord.state() == QProcess::Running)arecord.close();
qDebug()<<"Stop Auto Amp Manager\n"; qDebug()<<"Stop Auto Amp Manager\n";
} }
void AmpManager::doTick() void AmpManager::doTick()
{ {
if(_audioDevice->error() == 0 && _ioDevice != nullptr) if(arecord.state() == QProcess::Running)
{ {
QByteArray buffer = _ioDevice->readAll(); QByteArray buffer = arecord.readAllStandardOutput();
for(long i = 0; i < buffer.size(); i++) for(long i = 0; i < buffer.size(); i++)
{ {
if((uint8_t) buffer.at(i) != 128) if((uint8_t) buffer.at(i) != 128)
@ -103,6 +60,6 @@ void AmpManager::doTick()
_micro->relayOn(_relayNumber); _micro->relayOn(_relayNumber);
relayState = true; relayState = true;
} }
silenceCount++; silenceCount ++;
} }
} }

View File

@ -8,11 +8,9 @@
#include <QScopedPointer> #include <QScopedPointer>
#include <QEventLoop> #include <QEventLoop>
#include <QTimer> #include <QTimer>
#include <QProcess>
#include <QByteArray> #include <QByteArray>
#include <QtDebug> #include <QtDebug>
#include <QAudioDeviceInfo>
#include <alsa/asoundlib.h>
#include "microcontroller.h" #include "microcontroller.h"
@ -21,7 +19,7 @@ class AmpManager : public QObject, public QRunnable
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit AmpManager(Microcontroller *micro, int relayNumber, QAudioDeviceInfo device, QObject *parent = 0); explicit AmpManager(Microcontroller *micro, int relayNumber, QObject *parent = 0);
~AmpManager(); ~AmpManager();
@ -38,12 +36,8 @@ private:
Microcontroller *_micro; Microcontroller *_micro;
int _relayNumber; int _relayNumber;
char* _buffer;
snd_pcm_t *handle; QProcess arecord;
snd_pcm_hw_params_t *params;
snd_pcm_uframes_t frames;
char *buffer;
bool relayState = false; bool relayState = false;