diff --git a/lms-audio.xlm b/lms-audio.xlm index 8d3714f..7bc2563 100644 --- a/lms-audio.xlm +++ b/lms-audio.xlm @@ -1,5 +1,5 @@ - + diff --git a/recursos/LibreMediaServer_Audio.hed b/recursos/LibreMediaServer_Audio.hed deleted file mode 100755 index 82be283..0000000 --- a/recursos/LibreMediaServer_Audio.hed +++ /dev/null @@ -1,55 +0,0 @@ -ް׆ˌĠ򝤫鿰맫͓ԔҊÅЁ -ܥ -ңә -鿡 - -Ŷ -툢 -Ս - -߿ԁ -ö -ś— -髶 - - - - - - - - -х - - -ܛ - - - - -ǐ - - -ً - -ۃ - -붪 - - -܎ -Ė -쾡 -Ǖ - -𓎍 -ł - - - - - - - - - diff --git a/src/audiolayerwidget.cpp b/src/audiolayerwidget.cpp index c14bfbc..2c98d42 100644 --- a/src/audiolayerwidget.cpp +++ b/src/audiolayerwidget.cpp @@ -1,5 +1,7 @@ #include "audiolayerwidget.h" +#include + #include #include #include @@ -10,36 +12,16 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name): QGroupBox(parent) , m_suspendResumeButton(0) - , m_deviceBox(0) , m_watchDMX(new QTimer(this)) - , m_pullTimer(new QTimer(this)) - , m_device(QAudioDeviceInfo::defaultOutputDevice()) - , m_audioOutput(0) - , m_output(0) - , m_buffer(BufferSize, 0) - , m_decoder(0) , m_progressCounter(new QTime(0,0,0,1)) , m_progressMs(0) , m_currentMedia(" ") , m_running(false) - , m_emptyBuffer() { this->setTitle(name); QVBoxLayout *layout = new QVBoxLayout; - m_deviceBox = new QComboBox(this); - const QAudioDeviceInfo &defaultDeviceInfo = QAudioDeviceInfo::defaultOutputDevice(); - m_deviceBox->addItem(defaultDeviceInfo.deviceName(), qVariantFromValue(defaultDeviceInfo)); - foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) { - if (deviceInfo != defaultDeviceInfo) - m_deviceBox->addItem(deviceInfo.deviceName(), qVariantFromValue(deviceInfo)); - } - m_deviceBox->setMaximumWidth(250); - connect(m_deviceBox,SIGNAL(activated(int)), - this, SLOT(deviceChanged(int))); - layout->addWidget(m_deviceBox); - QHBoxLayout *status = new QHBoxLayout; m_statusLabel = new QLabel; m_statusLabel->setText(STATUS_LABEL); @@ -118,35 +100,9 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name): this->setLayout(layout); - m_format.setSampleRate(DataSampleRateHz); - m_format.setChannelCount(2); - m_format.setSampleSize(16); - m_format.setCodec("audio/pcm"); - 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"); - m_format = info.nearestFormat(m_format); - } - m_decoder = new AudioDecoder(m_format, this); - m_decoder->start(); - connect(m_decoder, SIGNAL(totalTimeChanged(qint64)), - this, SLOT(durationChanged(qint64))); - connect(m_pullTimer, SIGNAL(timeout()), - this, SLOT(pullTimerExpired())); - connect(m_watchDMX, SIGNAL(timeout()), this, SLOT(watchDMXExpired())); - m_watchDMX->start(1000); - - createAudioOutput(); + m_watchDMX->start(200); } AudioLayerWidget::~AudioLayerWidget() @@ -154,54 +110,46 @@ AudioLayerWidget::~AudioLayerWidget() } -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())); - 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) -{ - m_pullTimer->stop(); - m_audioOutput->stop(); - m_audioOutput->disconnect(this); - m_device = m_deviceBox->itemData(index).value(); - createAudioOutput(); -} - void AudioLayerWidget::volumeChanged(int value) { - if (m_audioOutput) - m_audioOutput->setVolume(qreal(value/100.0f)); + m_music.setVolume(value); } +// volume range 0 -100 void AudioLayerWidget::setVol(qreal vol) { - m_audioOutput->setVolume(vol); + m_music.setVolume(vol); m_volumeSlider->blockSignals(true); - int volume = vol * 100; - m_volumeSlider->setValue(volume); + m_volumeSlider->setValue(vol); m_volumeSlider->blockSignals(false); } void AudioLayerWidget::loadMedia(QString file) { - if (m_currentMedia == file) - return; - if (QFile::exists(file)){ - m_decoder->loadMedia(file); - setInitPosition(); - m_currentMedia = file; + if (m_currentMedia == file ) { fileLoaded(file); + return; } + if (!QFile::exists(file)) { + qWarning("Can not access to file %s", file.toLatin1().constData()); + return; + } + // Load an ogg music file + if (!m_music.openFromFile(file.toStdString())) { + qWarning("Can not open file %s", file.toLatin1().constData()); + return; + } + m_music.setAttenuation(0); + + m_progressCounter->restart(); + durationChanged(m_music.getDuration().asMilliseconds()); + fileLoaded(file); + + // Display music informations + std::cout << file.toLatin1().constData() << " : " << std::endl; + std::cout << " " << m_music.getDuration().asSeconds() << " seconds" << std::endl; + std::cout << " " << m_music.getSampleRate() << " samples / sec" << std::endl; + std::cout << " " << m_music.getChannelCount() << " channels" << std::endl; } void AudioLayerWidget::fileLoaded(QString file) @@ -212,133 +160,37 @@ void AudioLayerWidget::fileLoaded(QString file) m_folderValue->setText(list.at(size - 2)); m_fileValue->setText(list.at(size - 1)); } + m_progressMs = 0; + m_progressTime->setTime(QTime::fromMSecsSinceStartOfDay(m_progressMs)); } void AudioLayerWidget::notified() { - m_progressMs += m_progressCounter->restart(); - m_progressTime->setTime(QTime::fromMSecsSinceStartOfDay(m_progressMs)); - m_progressSlider->setValue(m_progressMs); -/* qDebug() << "bytesFree = " << m_audioOutput->bytesFree() - << ", " << "elapsedUSecs = " << m_audioOutput->elapsedUSecs() - << ", " << "processedUSecs = " << m_audioOutput->processedUSecs(); -*/ -} - -void AudioLayerWidget::pullTimerExpired() -{ - if (m_audioOutput && m_audioOutput->state() != QAudio::StoppedState) { - int chunks = m_audioOutput->bytesFree() / m_audioOutput->periodSize(); - while (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) { - resume(); - } else if (m_audioOutput->state() == QAudio::ActiveState) { - pause(); - } else if (m_audioOutput->state() == QAudio::StoppedState) { - play(); - } else if (m_audioOutput->state() == QAudio::IdleState) { - qWarning("%s: IdleState", this->title().toLatin1().constData()); - reset(); - resume(); - } -} - -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"); - } + } +// duration in miliseconds void AudioLayerWidget::durationChanged(qint64 dur) { - if (dur == -1) - return; - m_totalTimeValue->setTime(QTime::fromMSecsSinceStartOfDay(dur)); m_progressSlider->setMaximum(dur); + m_totalTimeValue->setTime(QTime::fromMSecsSinceStartOfDay(dur)); } void AudioLayerWidget::play() { - setInitPosition(); -// m_pullTimer->start(PULL_TIMER_INTERVAL); -// m_audioOutput->resume(); - m_running = true; - pullTimerExpired(); - m_progressCounter->start(); - m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); + m_music.play(); + m_progressCounter->restart(); } void AudioLayerWidget::pause() { -// 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_running = true; - pullTimerExpired(); - m_progressCounter->start(); - m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); + m_music.pause(); + m_progressCounter->restart(); } void AudioLayerWidget::stop() { - m_running = false; - setInitPosition(); -} - -void AudioLayerWidget::reset() -{ - m_pullTimer->stop(); - m_audioOutput->reset(); - m_output = m_audioOutput->start(); - Q_CHECK_PTR(m_output); -} - -void AudioLayerWidget::setInitPosition() -{ -// reset(); - m_decoder->setPos(0); - m_progressMs = 0; - m_progressTime->setTime(QTime::fromMSecsSinceStartOfDay(m_progressMs)); - m_progressSlider->setValue(m_progressMs); + m_music.stop(); } void AudioLayerWidget::watchDMXExpired() { @@ -348,9 +200,26 @@ void AudioLayerWidget::watchDMXExpired() { void AudioLayerWidget::updateWatchDMX(bool b) { m_receiveDMX->setChecked(b); + switch (m_music.getStatus()) { + case sf::SoundSource::Playing: + m_progressMs += m_progressCounter->restart(); + m_progressTime->setTime(QTime::fromMSecsSinceStartOfDay(m_progressMs)); + m_statusValue->setText(PLAY_LABEL); + break; + case sf::SoundSource::Paused: + m_statusValue->setText(PAUSE_LABEL); + break; + case sf::SoundSource::Stopped: + m_progressCounter->restart(); + m_progressMs = 0; + m_progressTime->setTime(QTime::fromMSecsSinceStartOfDay(m_progressMs)); + m_statusValue->setText(STOP_LABEL); + break; + } } -void AudioLayerWidget::flushBuffer() +void AudioLayerWidget::toggleSuspendResume() { - // Esto es una chapuza para arreglar que reset() no limpia el buffer realmente + } + diff --git a/src/audiolayerwidget.h b/src/audiolayerwidget.h index ce264c1..7244495 100644 --- a/src/audiolayerwidget.h +++ b/src/audiolayerwidget.h @@ -1,9 +1,8 @@ #ifndef AUDIOLAYERWIDGET_H #define AUDIOLAYERWIDGET_H -#include #include -#include + #include #include #include @@ -13,7 +12,9 @@ #include #include -#include "audiodecoder.h" +#include "SFML/Audio.hpp" +#include "SFML/System.hpp" + #include "defines.h" class AudioLayerWidget : public QGroupBox @@ -31,8 +32,8 @@ public: void pause(); void setVol(qreal vol); void resume(); - void updateWatchDMX(bool b); + public slots: void toggleSuspendResume(); @@ -40,7 +41,6 @@ public slots: private: QPushButton *m_suspendResumeButton; - QComboBox *m_deviceBox; QLabel *m_statusLabel; QLabel * m_statusValue; @@ -66,14 +66,6 @@ private: QCheckBox *m_receiveDMX; QTimer *m_watchDMX; - QTimer *m_pullTimer; - QAudioDeviceInfo m_device; - QAudioOutput *m_audioOutput; - QIODevice *m_output; // not owned - QAudioFormat m_format; - QByteArray m_buffer; - AudioDecoder *m_decoder; - QTime *m_progressCounter; quint64 m_progressMs; @@ -81,20 +73,11 @@ private: bool m_running; - QByteArray m_emptyBuffer; + sf::Music m_music; - void createAudioOutput(); - - void reset(); - void setInitPosition(); - - void flushBuffer(); private slots: void notified(); - void pullTimerExpired(); void fileLoaded(QString file); - void handleStateChanged(QAudio::State state); - void deviceChanged(int index); void durationChanged(qint64 dur); void watchDMXExpired(); }; diff --git a/src/audiomasterwidget.cpp b/src/audiomasterwidget.cpp index 0e7ba01..96c195a 100644 --- a/src/audiomasterwidget.cpp +++ b/src/audiomasterwidget.cpp @@ -1,20 +1,40 @@ #include "audiomasterwidget.h" +#include + AudioMasterWidget::AudioMasterWidget(QWidget *parent) : QGroupBox(parent) + , m_file(new QLabel) + , m_folder(new QLabel) + , m_vol(new QSlider) + , m_mute(new QCheckBox) + , m_status(new QLabel) + , m_receiveDMX(new QCheckBox) + , m_watchDMX(new QTimer) { - status = new QLabel(this); - vol = new QSlider(this); - mute = new QCheckBox(this); - QVBoxLayout *vbox = new QVBoxLayout; - vbox->addWidget(status); - vbox->addWidget(vol); - vbox->addWidget(mute); +// vbox->addWidget(status); +// vbox->addWidget(vol); +// vbox->addWidget(mute); + m_receiveDMX->setText("Receiving DMX"); + vbox->addWidget(m_receiveDMX); this->setLayout(vbox); + connect(m_watchDMX, SIGNAL(timeout()), + this, SLOT(watchDMXExpired())); + m_watchDMX->start(1000); + } AudioMasterWidget::~AudioMasterWidget() { } + +void AudioMasterWidget::watchDMXExpired() { + m_receiveDMX->setChecked(false); +} + +void AudioMasterWidget::updateWatchDMX() +{ + m_receiveDMX->setChecked(true); +} diff --git a/src/audiomasterwidget.h b/src/audiomasterwidget.h index d87a237..f48c7bb 100644 --- a/src/audiomasterwidget.h +++ b/src/audiomasterwidget.h @@ -1,12 +1,11 @@ #ifndef AUDIOMASTERWIDGET_H #define AUDIOMASTERWIDGET_H -#include #include -#include +#include #include #include -#include +#include //#include "ui_audiomasterwidget.h" @@ -24,14 +23,22 @@ public: ~AudioMasterWidget(); -private: +public slots: + void updateWatchDMX(); + +private: + QLabel *m_file; + QLabel *m_folder; + QSlider *m_vol; + QCheckBox *m_mute; + QLabel *m_status; + QCheckBox *m_receiveDMX; + QTimer *m_watchDMX; + +private slots: + void watchDMXExpired(); + - QLabel *file; - QLabel *folder; - QSlider *vol; - QCheckBox *mute; - QLabel *status; }; - #endif // AUDIOMASTERWIDGET_H diff --git a/src/audiowidget.cpp b/src/audiowidget.cpp index 51a4be9..e56ee75 100644 --- a/src/audiowidget.cpp +++ b/src/audiowidget.cpp @@ -27,20 +27,19 @@ void AudioWidget::volChanged(int layer, qreal vol) { dynamic_cast(item->widget())->setVol(vol); } -void AudioWidget::playbackChanged(int layer, QAudio::State state) +void AudioWidget::playbackChanged(int layer, Status status) { QLayoutItem * const item = layout->itemAt(layer); - switch (state) { - case QAudio::ActiveState: + switch (status) { + case Playing: dynamic_cast(item->widget())->play(); break; - case QAudio::StoppedState: + case Stopped: + dynamic_cast(item->widget())->stop(); + break; + case Paused: dynamic_cast(item->widget())->pause(); break; - case QAudio::SuspendedState: - dynamic_cast(item->widget())->resume(); - case QAudio::IdleState: - break; } } diff --git a/src/audiowidget.h b/src/audiowidget.h index 6654fae..ce999d5 100644 --- a/src/audiowidget.h +++ b/src/audiowidget.h @@ -8,6 +8,8 @@ #include "audiolayerwidget.h" #include "defines.h" +#include "SFML/Audio/SoundSource.hpp" + class AudioWidget : public QWidget { Q_OBJECT @@ -21,9 +23,9 @@ private: signals: public slots: - void mediaLoaded(int layer, QString media); + void mediaLoaded(int layer, QString media ); void volChanged(int layer, qreal vol); - void playbackChanged(int layer, QAudio::State state); + void playbackChanged(int layer, Status status); void layerReceived(int layer); }; diff --git a/src/defines.h b/src/defines.h index f48f7dd..4b84f5c 100644 --- a/src/defines.h +++ b/src/defines.h @@ -57,5 +57,12 @@ struct MediaFolder { QList m_MediaInformation; // Pointer to the Medias Information List of this Library }; +enum Status +{ + Stopped, ///< Sound is not playing + Paused, ///< Sound is paused + Playing ///< Sound is playing +}; + #endif // DEFINES_H diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index 0a25b05..3f844c6 100755 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -20,9 +20,6 @@ QTextEdit * libreMediaServerAudio::textEdit = 0; - - - /** / Constructor */ @@ -70,13 +67,12 @@ libreMediaServerAudio::libreMediaServerAudio(QStringList args, QWidget *parent) textEdit, SLOT(append(QString)), Qt::QueuedConnection); */ // Inicia el widget Master. No implementado todavía -/* amw = new AudioMasterWidget(this); QDockWidget *topWidget = new QDockWidget(tr("Master"), this); topWidget->setAllowedAreas(Qt::TopDockWidgetArea); topWidget->setWidget(amw); addDockWidget(Qt::TopDockWidgetArea, topWidget); -*/ + // Conectamos los menus connect(ui.actionOpen_conf, SIGNAL(triggered()), this, SLOT(openFile())); connect(ui.actionSave_conf, SIGNAL(triggered()), this, SLOT(saveFile())); @@ -196,7 +192,7 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value) break; case VOLUME_COARSE: f = ( value * 0x100 ) + ola->getValue(layer, VOLUME_FINE); - aw->volChanged(layer, f / 65535); + aw->volChanged(layer, f / 655.35); break; case VOLUME_FINE: f = ( ola->getValue(layer, VOLUME_COARSE) * 0x100 ) + value; @@ -211,13 +207,13 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value) aux = value / 25; switch (aux) { case 0 : - aw->playbackChanged(layer, QAudio::ActiveState); + aw->playbackChanged(layer, Playing); break; case 1 : - aw->playbackChanged(layer, QAudio::StoppedState); + aw->playbackChanged(layer, Stopped); break; case 2 : - aw->playbackChanged(layer, QAudio::SuspendedState); + aw->playbackChanged(layer, Paused); break; } default: diff --git a/src/libremediaserver-audio.pro b/src/libremediaserver-audio.pro index 037f010..8e4b44c 100755 --- a/src/libremediaserver-audio.pro +++ b/src/libremediaserver-audio.pro @@ -1,7 +1,7 @@ TEMPLATE = app TARGET = libremediaserver-audio -QT += network script webkitwidgets widgets multimedia +QT += webkitwidgets widgets CONFIG += debug DESTDIR = ./debug @@ -14,8 +14,7 @@ HEADERS += libremediaserver-audio.h \ audiowidget.h \ audiomasterwidget.h \ defines.h \ - settings.h \ - audiodecoder.h + settings.h SOURCES += main.cpp \ libremediaserver-audio.cpp \ @@ -24,23 +23,12 @@ SOURCES += main.cpp \ audiolayerwidget.cpp \ audiowidget.cpp \ audiomasterwidget.cpp \ - settings.cpp \ - audiodecoder.cpp + settings.cpp FORMS += \ libremediaserver-audio.ui -#INCLUDEPATH += ./ - LIBS += -lola -lolacommon -# -L./debug - -#win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../debug/release/ -lcitp -#else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../debug/debug/ -lcitp -#else:symbian: LIBS += -lcitp -#else:unix: LIBS += -L$$PWD/../debug/ -lcitp -#INCLUDEPATH += $$PWD/../debug -#DEPENDPATH += $$PWD/../debug RESOURCES = @@ -51,3 +39,11 @@ OTHER_FILES += \ ../compiling.txt \ ../changelog.txt \ ../lms-audio.xlm + +win32:CONFIG(release, debug|release): LIBS += -L$$PWD/SFML/lib/release/ -lsfml-audio +else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/SFML/lib/debug/ -lsfml-audio +else:symbian: LIBS += -lsfml-audio +else:unix: LIBS += -L$$PWD/SFML/lib/ -lsfml-audio -lsfml-system + +INCLUDEPATH += $$PWD/SFML/include +DEPENDPATH += $$PWD/SFML/include