diff --git a/src/audiolayerwidget.cpp b/src/audiolayerwidget.cpp index 2334319..c14bfbc 100644 --- a/src/audiolayerwidget.cpp +++ b/src/audiolayerwidget.cpp @@ -5,6 +5,8 @@ #include #include +#include // nanosleep y la chapuza de liberar el buffer + AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name): QGroupBox(parent) , m_suspendResumeButton(0) @@ -19,7 +21,8 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name): , m_progressCounter(new QTime(0,0,0,1)) , m_progressMs(0) , m_currentMedia(" ") - + , m_running(false) + , m_emptyBuffer() { this->setTitle(name); @@ -122,6 +125,11 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name): m_format.setByteOrder(QAudioFormat::LittleEndian); m_format.setSampleType(QAudioFormat::SignedInt); + // Init the silent buffer + QAudioBuffer *abuf = new QAudioBuffer(44100, m_format, -1); + QByteArray ba((const char*)abuf->data(), abuf->byteCount()); + m_emptyBuffer.append(ba); + QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); if (!info.isFormatSupported(m_format)) { qWarning("Default format not supported - trying to use nearest"); @@ -139,7 +147,6 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name): m_watchDMX->start(1000); createAudioOutput(); - pause(); } AudioLayerWidget::~AudioLayerWidget() @@ -152,10 +159,13 @@ void AudioLayerWidget::createAudioOutput() m_audioOutput = new QAudioOutput(m_device, m_format, this); Q_CHECK_PTR(m_audioOutput); m_audioOutput->setNotifyInterval(NOTIFY_INTERVAL); + m_audioOutput->setCategory("LibreMediaServer"); connect(m_audioOutput, SIGNAL(notify()), SLOT(notified())); - reset(); + m_output = m_audioOutput->start(); + Q_CHECK_PTR(m_output); m_statusValue->setText(PAUSE_LABEL); connect(m_audioOutput, SIGNAL(stateChanged(QAudio::State)), SLOT(handleStateChanged(QAudio::State))); + m_pullTimer->start(PULL_TIMER_INTERVAL); } void AudioLayerWidget::deviceChanged(int index) @@ -217,25 +227,28 @@ void AudioLayerWidget::notified() void AudioLayerWidget::pullTimerExpired() { - if (m_audioOutput && m_audioOutput->state() != QAudio::StoppedState) { + if (m_audioOutput && m_audioOutput->state() != QAudio::StoppedState) { int chunks = m_audioOutput->bytesFree() / m_audioOutput->periodSize(); while (chunks) { - const qint64 len = m_decoder->read(m_buffer.data(), m_audioOutput->periodSize()); - if ( len == -1) { - stop(); - qDebug("End of file %s", this->title().toLatin1().constData()); - break; - } - if (len) { - m_output->write(m_buffer.data(), len); - } - if (len != m_audioOutput->periodSize()) - break; - --chunks; + if (m_running) { + const qint64 len = m_decoder->read(m_buffer.data(), m_audioOutput->periodSize()); + if ( len == -1) { + stop(); + qDebug("End of file %s", this->title().toLatin1().constData()); + break; + } + if (len) { + m_output->write(m_buffer.data(), len); + } + if (len != m_audioOutput->periodSize()) + break; + } else { + m_output->write(m_emptyBuffer.data(), m_audioOutput->periodSize()); + } + --chunks; } } } - void AudioLayerWidget::toggleSuspendResume() { if (m_audioOutput->state() == QAudio::SuspendedState) { @@ -246,7 +259,8 @@ void AudioLayerWidget::toggleSuspendResume() play(); } else if (m_audioOutput->state() == QAudio::IdleState) { qWarning("%s: IdleState", this->title().toLatin1().constData()); - play(); + reset(); + resume(); } } @@ -254,12 +268,16 @@ void AudioLayerWidget::handleStateChanged(QAudio::State state) { if (state == QAudio::SuspendedState) { m_statusValue->setText(PAUSE_LABEL); + qDebug("Pause"); } else if (state == QAudio::ActiveState) { m_statusValue->setText(PLAY_LABEL); + qDebug("Play"); } else if (m_audioOutput->state() == QAudio::StoppedState) { m_statusValue->setText(STOP_LABEL); + qDebug("Stop"); } else if (state == QAudio::IdleState) { m_statusValue->setText(IDDLE_LABEL); + qDebug("Iddle"); } } @@ -273,10 +291,10 @@ void AudioLayerWidget::durationChanged(qint64 dur) void AudioLayerWidget::play() { -// reset(); setInitPosition(); - m_pullTimer->start(PULL_TIMER_INTERVAL); - m_audioOutput->resume(); +// m_pullTimer->start(PULL_TIMER_INTERVAL); +// m_audioOutput->resume(); + m_running = true; pullTimerExpired(); m_progressCounter->start(); m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); @@ -284,15 +302,17 @@ void AudioLayerWidget::play() void AudioLayerWidget::pause() { - m_audioOutput->suspend(); - m_pullTimer->stop(); +// m_pullTimer->stop(); +// m_audioOutput->suspend(); + m_running = false; m_suspendResumeButton->setText(tr(RESUME_LABEL)); } void AudioLayerWidget::resume() { - m_pullTimer->start(PULL_TIMER_INTERVAL); - m_audioOutput->resume(); +// m_pullTimer->start(PULL_TIMER_INTERVAL); +// m_audioOutput->resume(); + m_running = true; pullTimerExpired(); m_progressCounter->start(); m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); @@ -300,7 +320,7 @@ void AudioLayerWidget::resume() void AudioLayerWidget::stop() { -// reset(); + m_running = false; setInitPosition(); } @@ -310,12 +330,11 @@ void AudioLayerWidget::reset() m_audioOutput->reset(); m_output = m_audioOutput->start(); Q_CHECK_PTR(m_output); -// pause(); } void AudioLayerWidget::setInitPosition() { - reset(); +// reset(); m_decoder->setPos(0); m_progressMs = 0; m_progressTime->setTime(QTime::fromMSecsSinceStartOfDay(m_progressMs)); @@ -330,3 +349,8 @@ void AudioLayerWidget::updateWatchDMX(bool b) { m_receiveDMX->setChecked(b); } + +void AudioLayerWidget::flushBuffer() +{ + // Esto es una chapuza para arreglar que reset() no limpia el buffer realmente +} diff --git a/src/audiolayerwidget.h b/src/audiolayerwidget.h index 14eed99..ce264c1 100644 --- a/src/audiolayerwidget.h +++ b/src/audiolayerwidget.h @@ -79,11 +79,16 @@ private: QString m_currentMedia; + bool m_running; + + QByteArray m_emptyBuffer; + void createAudioOutput(); void reset(); void setInitPosition(); + void flushBuffer(); private slots: void notified(); void pullTimerExpired(); diff --git a/src/libremediaserver-audio.ui b/src/libremediaserver-audio.ui index 426d92c..188a656 100755 --- a/src/libremediaserver-audio.ui +++ b/src/libremediaserver-audio.ui @@ -7,8 +7,8 @@ 0 0 - 60 - 57 + 126 + 89 @@ -20,7 +20,7 @@ 0 0 - 60 + 126 29