Changed the audio library to SFML. Now working in qt5.3.2.
This commit is contained in:
parent
37835e7571
commit
1dd20c9b05
11 changed files with 143 additions and 319 deletions
|
@ -1,5 +1,5 @@
|
||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<dmxSettings fileVersion="1" layersNumber="3" path="/home/santi/lo_que_vio_el_mayordomo/sound" universeNumber="1">
|
<dmxSettings fileVersion="1" layersNumber="3" path="/home/santi/audio" universeNumber="1">
|
||||||
<layer0 dmx="1" universe="1" />
|
<layer0 dmx="1" universe="1" />
|
||||||
<layer1 dmx="21" universe="1" />
|
<layer1 dmx="21" universe="1" />
|
||||||
<layer2 dmx="41" universe="1" />
|
<layer2 dmx="41" universe="1" />
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
^皾湏毄讍悊€潫憙嚈曀寑剛扰臓崙櫗泛疮鷼岸沪瓲驖か<EFBFBD><EFBFBD><EFBFBD><EFBFBD>堪彪Й,称蛽咴斕与栧蚜赁尬履匾娤了脜绿衼祧<EFBFBD><EFBFBD><EFBFBD><EFBFBD>雠疰鬻惆<EFBFBD><<EFBFBD>
|
|
||||||
堀阜刀ā相槜灜鬯勖
|
|
||||||
и拍媚菀<EFBFBD>彏帶寣巼秮憯剴€煥覆蝶趱毤丁窚但К煯缚<EFBFBD>溟驷钽伿谠訖<EFBFBD>
|
|
||||||
増唵檮儌劀煘潨嚉櫂棅晹搾崘<EFBFBD><EFBFBD><EFBFBD>┅沪イ⒕ 榭〖缓垢范胆
|
|
||||||
≡顡嫄欃稚惹婆拿禽肋掭苒谫<EFBFBD>
|
|
||||||
哦剨廖研镱盱腓蹊珂邃汊帱
|
|
||||||
韴<EFBFBD><EFBFBD>魂膂豸篁耩崚崒媻増噺<EFBFBD>
|
|
||||||
桋圯諐倽湜殭槜攭敁拺惎<EFBFBD><EFBFBD>
|
|
||||||
故貔铘赭<EFBFBD>綘烤郊缓护范荡巢睘<EFBFBD>
|
|
||||||
呖敂崐槡棕寐晾咿蒉勤儇字赵佄
|
|
||||||
枚安ū菌勘钩鼬汊徉<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鲺趔<EFBFBD>
|
|
||||||
銋咽吓浭盅俾棙儌亐煘潥嚉櫂棖晹悗
|
|
||||||
冨耜镥皇鲴<EFBFBD>狄<EFBFBD>臣烤郊缓归<EFBFBD>荡巢毕脱
|
|
||||||
拶稚惹婆拿垒肋掭苒谯<EFBFBD>
|
|
||||||
拍稍右研镱镳腙殍珂彐<EFBFBD>
|
|
||||||
痼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鲺趔蝰饙<EFBFBD>
|
|
||||||
煘棅増噯厔仦亐煘潨洏<EFBFBD>
|
|
||||||
妳姇敁拺惎<EFBFBD><EFBFBD><EFBFBD>ěΗ<EFBFBD>
|
|
||||||
卑綘烤郊缓护范荡巢蓖<EFBFBD>
|
|
||||||
咿资扇瞧拍赁晾咿蒈圬<EFBFBD>
|
|
||||||
刈中扔已畜铐潆鲩桤琦溷赆<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>牾趔黜饛帊悑妷帥唴寖<EFBFBD>
|
|
||||||
亐煔亷<EFBFBD>妊厞晹搾崘<EFBFBD>グ<EFBFBD>┅沪イ"<EFBFBD>竣
|
|
||||||
郊痪オ则牯‘毕夏兴适邵婆穆蘖肋掭苒谂
|
|
||||||
刈盅攘皠摢掣<EFBFBD>觊脲<EFBFBD>溏除<EFBFBD><EFBFBD><EFBFBD>帑<EFBFBD><EFBFBD>鲺麸
|
|
||||||
蝰饖挓筝軟攪唴劅倎仐倽湜泤槜枙敁拺<EFBFBD>
|
|
||||||
<EFBFBD><EFBFBD>犯婶鲲黪瘗臣烤嫉Ш够丢荡吵<EFBFBD>瓮趟噬熔
|
|
||||||
婆拿铝肋<EFBFBD>
|
|
||||||
蒈圳儇字稍右研镱眇腙殍珂邃<EFBFBD>忉<EFBFBD><EFBFBD><EFBFBD><EFBFBD>纟<EFBFBD>鲺趔蝽饛帊寢妷攪唴剝倎€優潨洑櫂棅晹搾憪<EFBFBD>爆<EFBFBD>┄Еジ"<EFBFBD>烤郊Ш垢范荡钞毕瓮趟噬郧婆拿铝烂掭苒谫刈收杂已酗铖
|
|
||||||
<EFBFBD>鲩桤驽溷恺<EFBFBD><EFBFBD><EFBFBD>帑<EFBFBD><EFBFBD>鲺趔铖饛帒寢妷<EFBFBD>
|
|
||||||
噯厔儌亣優湝泦櫃枱墧捛悓
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>┊沪が><EFBFBD>烤〖翰工
|
|
||||||
范荡巢馍彝趟收惹婆孛铝烂
|
|
||||||
掭苒谫嬓收杂彝酗铐痣觊棼
|
|
||||||
驽溷忉锄恺<EFBFBD><EFBFBD><EFBFBD>鲺梵篑驌
|
|
||||||
帊寢妷蹆殔厓倽€煘潃洓櫂<EFBFBD>
|
|
||||||
枙敁拺惃箔<EFBFBD><EFBFBD>ěΕ福)牐
|
|
||||||
窘蓟汗攵<EFBFBD>闯箔衔吞资扇勤
|
|
||||||
拍寐晾屵淋圳倌字赵弦研矧
|
|
||||||
盱腙殍存<EFBFBD>汊狳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
豸篁耩軒憣媻墧噯厔焸亐焸
|
|
||||||
潨洑櫂臇墧搾憣<EFBFBD><EFBFBD>藩┄Ш
|
|
||||||
イ"<EFBFBD>炀〖缓工范荡<EFBFBD>毕窝
|
|
||||||
趟噬惹暸孛铝烂掭苒瀑刈稚
|
|
||||||
杂已酗巾痣觊棼驽溷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>ヵ梵蝰饟帊寢枆垏啓
|
|
||||||
柵偀€湆<EFBFBD>
|
|
||||||
湜殭剠剦唩巸偝<EFBFBD><EFBFBD>订ěЧぃⅰ伎窘姬汗缚<EFBFBD>闯脖衔托
|
|
||||||
耸扇瞧牌<EFBFBD>
|
|
||||||
杏芡塘紊<EFBFBD>
|
|
||||||
倨字赵右托耦盱腙轸瑛邃汊徉泾泓<EFBFBD><EFBFBD>麝蹶篁耩弾憣晩増噯厴
|
|
||||||
憪潃煘潃
|
|
||||||
泦檮棅晥搸憣<EFBFBD><EFBFBD><EFBFBD>┄Еイ<EFBFBD>
|
|
||||||
⒔牐尽姬亥斧订疮箔弦托
|
|
||||||
酥稍勤
|
|
||||||
咆<EFBFBD>
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "audiolayerwidget.h"
|
#include "audiolayerwidget.h"
|
||||||
|
|
||||||
|
#include<iostream>
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
@ -10,36 +12,16 @@
|
||||||
AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name):
|
AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name):
|
||||||
QGroupBox(parent)
|
QGroupBox(parent)
|
||||||
, m_suspendResumeButton(0)
|
, m_suspendResumeButton(0)
|
||||||
, m_deviceBox(0)
|
|
||||||
, m_watchDMX(new QTimer(this))
|
, 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_progressCounter(new QTime(0,0,0,1))
|
||||||
, m_progressMs(0)
|
, m_progressMs(0)
|
||||||
, m_currentMedia(" ")
|
, m_currentMedia(" ")
|
||||||
, m_running(false)
|
, m_running(false)
|
||||||
, m_emptyBuffer()
|
|
||||||
{
|
{
|
||||||
this->setTitle(name);
|
this->setTitle(name);
|
||||||
|
|
||||||
QVBoxLayout *layout = new QVBoxLayout;
|
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;
|
QHBoxLayout *status = new QHBoxLayout;
|
||||||
m_statusLabel = new QLabel;
|
m_statusLabel = new QLabel;
|
||||||
m_statusLabel->setText(STATUS_LABEL);
|
m_statusLabel->setText(STATUS_LABEL);
|
||||||
|
@ -118,35 +100,9 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name):
|
||||||
|
|
||||||
this->setLayout(layout);
|
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()),
|
connect(m_watchDMX, SIGNAL(timeout()),
|
||||||
this, SLOT(watchDMXExpired()));
|
this, SLOT(watchDMXExpired()));
|
||||||
m_watchDMX->start(1000);
|
m_watchDMX->start(200);
|
||||||
|
|
||||||
createAudioOutput();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioLayerWidget::~AudioLayerWidget()
|
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<QAudioDeviceInfo>();
|
|
||||||
createAudioOutput();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioLayerWidget::volumeChanged(int value)
|
void AudioLayerWidget::volumeChanged(int value)
|
||||||
{
|
{
|
||||||
if (m_audioOutput)
|
m_music.setVolume(value);
|
||||||
m_audioOutput->setVolume(qreal(value/100.0f));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// volume range 0 -100
|
||||||
void AudioLayerWidget::setVol(qreal vol)
|
void AudioLayerWidget::setVol(qreal vol)
|
||||||
{
|
{
|
||||||
m_audioOutput->setVolume(vol);
|
m_music.setVolume(vol);
|
||||||
m_volumeSlider->blockSignals(true);
|
m_volumeSlider->blockSignals(true);
|
||||||
int volume = vol * 100;
|
m_volumeSlider->setValue(vol);
|
||||||
m_volumeSlider->setValue(volume);
|
|
||||||
m_volumeSlider->blockSignals(false);
|
m_volumeSlider->blockSignals(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioLayerWidget::loadMedia(QString file)
|
void AudioLayerWidget::loadMedia(QString file)
|
||||||
{
|
{
|
||||||
if (m_currentMedia == file)
|
if (m_currentMedia == file ) {
|
||||||
return;
|
|
||||||
if (QFile::exists(file)){
|
|
||||||
m_decoder->loadMedia(file);
|
|
||||||
setInitPosition();
|
|
||||||
m_currentMedia = file;
|
|
||||||
fileLoaded(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)
|
void AudioLayerWidget::fileLoaded(QString file)
|
||||||
|
@ -212,133 +160,37 @@ void AudioLayerWidget::fileLoaded(QString file)
|
||||||
m_folderValue->setText(list.at(size - 2));
|
m_folderValue->setText(list.at(size - 2));
|
||||||
m_fileValue->setText(list.at(size - 1));
|
m_fileValue->setText(list.at(size - 1));
|
||||||
}
|
}
|
||||||
|
m_progressMs = 0;
|
||||||
|
m_progressTime->setTime(QTime::fromMSecsSinceStartOfDay(m_progressMs));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioLayerWidget::notified()
|
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)
|
void AudioLayerWidget::durationChanged(qint64 dur)
|
||||||
{
|
{
|
||||||
if (dur == -1)
|
|
||||||
return;
|
|
||||||
m_totalTimeValue->setTime(QTime::fromMSecsSinceStartOfDay(dur));
|
|
||||||
m_progressSlider->setMaximum(dur);
|
m_progressSlider->setMaximum(dur);
|
||||||
|
m_totalTimeValue->setTime(QTime::fromMSecsSinceStartOfDay(dur));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioLayerWidget::play()
|
void AudioLayerWidget::play()
|
||||||
{
|
{
|
||||||
setInitPosition();
|
m_music.play();
|
||||||
// m_pullTimer->start(PULL_TIMER_INTERVAL);
|
m_progressCounter->restart();
|
||||||
// m_audioOutput->resume();
|
|
||||||
m_running = true;
|
|
||||||
pullTimerExpired();
|
|
||||||
m_progressCounter->start();
|
|
||||||
m_suspendResumeButton->setText(tr(SUSPEND_LABEL));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioLayerWidget::pause()
|
void AudioLayerWidget::pause()
|
||||||
{
|
{
|
||||||
// m_pullTimer->stop();
|
m_music.pause();
|
||||||
// m_audioOutput->suspend();
|
m_progressCounter->restart();
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioLayerWidget::stop()
|
void AudioLayerWidget::stop()
|
||||||
{
|
{
|
||||||
m_running = false;
|
m_music.stop();
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioLayerWidget::watchDMXExpired() {
|
void AudioLayerWidget::watchDMXExpired() {
|
||||||
|
@ -348,9 +200,26 @@ void AudioLayerWidget::watchDMXExpired() {
|
||||||
void AudioLayerWidget::updateWatchDMX(bool b)
|
void AudioLayerWidget::updateWatchDMX(bool b)
|
||||||
{
|
{
|
||||||
m_receiveDMX->setChecked(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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
#ifndef AUDIOLAYERWIDGET_H
|
#ifndef AUDIOLAYERWIDGET_H
|
||||||
#define AUDIOLAYERWIDGET_H
|
#define AUDIOLAYERWIDGET_H
|
||||||
|
|
||||||
#include <QAudioOutput>
|
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <QComboBox>
|
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QSlider>
|
#include <QSlider>
|
||||||
|
@ -13,7 +12,9 @@
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
|
|
||||||
#include "audiodecoder.h"
|
#include "SFML/Audio.hpp"
|
||||||
|
#include "SFML/System.hpp"
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
|
||||||
class AudioLayerWidget : public QGroupBox
|
class AudioLayerWidget : public QGroupBox
|
||||||
|
@ -31,8 +32,8 @@ public:
|
||||||
void pause();
|
void pause();
|
||||||
void setVol(qreal vol);
|
void setVol(qreal vol);
|
||||||
void resume();
|
void resume();
|
||||||
|
|
||||||
void updateWatchDMX(bool b);
|
void updateWatchDMX(bool b);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void toggleSuspendResume();
|
void toggleSuspendResume();
|
||||||
|
@ -40,7 +41,6 @@ public slots:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QPushButton *m_suspendResumeButton;
|
QPushButton *m_suspendResumeButton;
|
||||||
QComboBox *m_deviceBox;
|
|
||||||
|
|
||||||
QLabel *m_statusLabel;
|
QLabel *m_statusLabel;
|
||||||
QLabel * m_statusValue;
|
QLabel * m_statusValue;
|
||||||
|
@ -66,14 +66,6 @@ private:
|
||||||
QCheckBox *m_receiveDMX;
|
QCheckBox *m_receiveDMX;
|
||||||
QTimer *m_watchDMX;
|
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;
|
QTime *m_progressCounter;
|
||||||
quint64 m_progressMs;
|
quint64 m_progressMs;
|
||||||
|
|
||||||
|
@ -81,20 +73,11 @@ private:
|
||||||
|
|
||||||
bool m_running;
|
bool m_running;
|
||||||
|
|
||||||
QByteArray m_emptyBuffer;
|
sf::Music m_music;
|
||||||
|
|
||||||
void createAudioOutput();
|
|
||||||
|
|
||||||
void reset();
|
|
||||||
void setInitPosition();
|
|
||||||
|
|
||||||
void flushBuffer();
|
|
||||||
private slots:
|
private slots:
|
||||||
void notified();
|
void notified();
|
||||||
void pullTimerExpired();
|
|
||||||
void fileLoaded(QString file);
|
void fileLoaded(QString file);
|
||||||
void handleStateChanged(QAudio::State state);
|
|
||||||
void deviceChanged(int index);
|
|
||||||
void durationChanged(qint64 dur);
|
void durationChanged(qint64 dur);
|
||||||
void watchDMXExpired();
|
void watchDMXExpired();
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,20 +1,40 @@
|
||||||
#include "audiomasterwidget.h"
|
#include "audiomasterwidget.h"
|
||||||
|
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
AudioMasterWidget::AudioMasterWidget(QWidget *parent) :
|
AudioMasterWidget::AudioMasterWidget(QWidget *parent) :
|
||||||
QGroupBox(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;
|
QVBoxLayout *vbox = new QVBoxLayout;
|
||||||
vbox->addWidget(status);
|
// vbox->addWidget(status);
|
||||||
vbox->addWidget(vol);
|
// vbox->addWidget(vol);
|
||||||
vbox->addWidget(mute);
|
// vbox->addWidget(mute);
|
||||||
|
m_receiveDMX->setText("Receiving DMX");
|
||||||
|
vbox->addWidget(m_receiveDMX);
|
||||||
this->setLayout(vbox);
|
this->setLayout(vbox);
|
||||||
|
connect(m_watchDMX, SIGNAL(timeout()),
|
||||||
|
this, SLOT(watchDMXExpired()));
|
||||||
|
m_watchDMX->start(1000);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioMasterWidget::~AudioMasterWidget()
|
AudioMasterWidget::~AudioMasterWidget()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioMasterWidget::watchDMXExpired() {
|
||||||
|
m_receiveDMX->setChecked(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioMasterWidget::updateWatchDMX()
|
||||||
|
{
|
||||||
|
m_receiveDMX->setChecked(true);
|
||||||
|
}
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
#ifndef AUDIOMASTERWIDGET_H
|
#ifndef AUDIOMASTERWIDGET_H
|
||||||
#define AUDIOMASTERWIDGET_H
|
#define AUDIOMASTERWIDGET_H
|
||||||
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QtGui>
|
#include <QtGui>
|
||||||
#include <QGroupBox>
|
#include <QLabel>
|
||||||
#include <QSlider>
|
#include <QSlider>
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
#include <QVBoxLayout>
|
#include <QGroupBox>
|
||||||
|
|
||||||
//#include "ui_audiomasterwidget.h"
|
//#include "ui_audiomasterwidget.h"
|
||||||
|
|
||||||
|
@ -24,14 +23,22 @@ public:
|
||||||
|
|
||||||
~AudioMasterWidget();
|
~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
|
#endif // AUDIOMASTERWIDGET_H
|
||||||
|
|
|
@ -27,19 +27,18 @@ void AudioWidget::volChanged(int layer, qreal vol) {
|
||||||
dynamic_cast<AudioLayerWidget *>(item->widget())->setVol(vol);
|
dynamic_cast<AudioLayerWidget *>(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);
|
QLayoutItem * const item = layout->itemAt(layer);
|
||||||
switch (state) {
|
switch (status) {
|
||||||
case QAudio::ActiveState:
|
case Playing:
|
||||||
dynamic_cast<AudioLayerWidget *>(item->widget())->play();
|
dynamic_cast<AudioLayerWidget *>(item->widget())->play();
|
||||||
break;
|
break;
|
||||||
case QAudio::StoppedState:
|
case Stopped:
|
||||||
dynamic_cast<AudioLayerWidget *>(item->widget())->pause();
|
dynamic_cast<AudioLayerWidget *>(item->widget())->stop();
|
||||||
break;
|
break;
|
||||||
case QAudio::SuspendedState:
|
case Paused:
|
||||||
dynamic_cast<AudioLayerWidget *>(item->widget())->resume();
|
dynamic_cast<AudioLayerWidget *>(item->widget())->pause();
|
||||||
case QAudio::IdleState:
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include "audiolayerwidget.h"
|
#include "audiolayerwidget.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
|
||||||
|
#include "SFML/Audio/SoundSource.hpp"
|
||||||
|
|
||||||
class AudioWidget : public QWidget
|
class AudioWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -23,7 +25,7 @@ signals:
|
||||||
public slots:
|
public slots:
|
||||||
void mediaLoaded(int layer, QString media );
|
void mediaLoaded(int layer, QString media );
|
||||||
void volChanged(int layer, qreal vol);
|
void volChanged(int layer, qreal vol);
|
||||||
void playbackChanged(int layer, QAudio::State state);
|
void playbackChanged(int layer, Status status);
|
||||||
void layerReceived(int layer);
|
void layerReceived(int layer);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -57,5 +57,12 @@ struct MediaFolder {
|
||||||
QList<MediaFile> m_MediaInformation; // Pointer to the Medias Information List of this Library
|
QList<MediaFile> 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
|
#endif // DEFINES_H
|
||||||
|
|
||||||
|
|
|
@ -20,9 +20,6 @@
|
||||||
|
|
||||||
QTextEdit * libreMediaServerAudio::textEdit = 0;
|
QTextEdit * libreMediaServerAudio::textEdit = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
/ Constructor
|
/ Constructor
|
||||||
*/
|
*/
|
||||||
|
@ -70,13 +67,12 @@ libreMediaServerAudio::libreMediaServerAudio(QStringList args, QWidget *parent)
|
||||||
textEdit, SLOT(append(QString)), Qt::QueuedConnection);
|
textEdit, SLOT(append(QString)), Qt::QueuedConnection);
|
||||||
*/
|
*/
|
||||||
// Inicia el widget Master. No implementado todavía
|
// Inicia el widget Master. No implementado todavía
|
||||||
/*
|
|
||||||
amw = new AudioMasterWidget(this);
|
amw = new AudioMasterWidget(this);
|
||||||
QDockWidget *topWidget = new QDockWidget(tr("Master"), this);
|
QDockWidget *topWidget = new QDockWidget(tr("Master"), this);
|
||||||
topWidget->setAllowedAreas(Qt::TopDockWidgetArea);
|
topWidget->setAllowedAreas(Qt::TopDockWidgetArea);
|
||||||
topWidget->setWidget(amw);
|
topWidget->setWidget(amw);
|
||||||
addDockWidget(Qt::TopDockWidgetArea, topWidget);
|
addDockWidget(Qt::TopDockWidgetArea, topWidget);
|
||||||
*/
|
|
||||||
// Conectamos los menus
|
// Conectamos los menus
|
||||||
connect(ui.actionOpen_conf, SIGNAL(triggered()), this, SLOT(openFile()));
|
connect(ui.actionOpen_conf, SIGNAL(triggered()), this, SLOT(openFile()));
|
||||||
connect(ui.actionSave_conf, SIGNAL(triggered()), this, SLOT(saveFile()));
|
connect(ui.actionSave_conf, SIGNAL(triggered()), this, SLOT(saveFile()));
|
||||||
|
@ -196,7 +192,7 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value)
|
||||||
break;
|
break;
|
||||||
case VOLUME_COARSE:
|
case VOLUME_COARSE:
|
||||||
f = ( value * 0x100 ) + ola->getValue(layer, VOLUME_FINE);
|
f = ( value * 0x100 ) + ola->getValue(layer, VOLUME_FINE);
|
||||||
aw->volChanged(layer, f / 65535);
|
aw->volChanged(layer, f / 655.35);
|
||||||
break;
|
break;
|
||||||
case VOLUME_FINE:
|
case VOLUME_FINE:
|
||||||
f = ( ola->getValue(layer, VOLUME_COARSE) * 0x100 ) + value;
|
f = ( ola->getValue(layer, VOLUME_COARSE) * 0x100 ) + value;
|
||||||
|
@ -211,13 +207,13 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value)
|
||||||
aux = value / 25;
|
aux = value / 25;
|
||||||
switch (aux) {
|
switch (aux) {
|
||||||
case 0 :
|
case 0 :
|
||||||
aw->playbackChanged(layer, QAudio::ActiveState);
|
aw->playbackChanged(layer, Playing);
|
||||||
break;
|
break;
|
||||||
case 1 :
|
case 1 :
|
||||||
aw->playbackChanged(layer, QAudio::StoppedState);
|
aw->playbackChanged(layer, Stopped);
|
||||||
break;
|
break;
|
||||||
case 2 :
|
case 2 :
|
||||||
aw->playbackChanged(layer, QAudio::SuspendedState);
|
aw->playbackChanged(layer, Paused);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
TARGET = libremediaserver-audio
|
TARGET = libremediaserver-audio
|
||||||
|
|
||||||
QT += network script webkitwidgets widgets multimedia
|
QT += webkitwidgets widgets
|
||||||
|
|
||||||
CONFIG += debug
|
CONFIG += debug
|
||||||
DESTDIR = ./debug
|
DESTDIR = ./debug
|
||||||
|
@ -14,8 +14,7 @@ HEADERS += libremediaserver-audio.h \
|
||||||
audiowidget.h \
|
audiowidget.h \
|
||||||
audiomasterwidget.h \
|
audiomasterwidget.h \
|
||||||
defines.h \
|
defines.h \
|
||||||
settings.h \
|
settings.h
|
||||||
audiodecoder.h
|
|
||||||
|
|
||||||
SOURCES += main.cpp \
|
SOURCES += main.cpp \
|
||||||
libremediaserver-audio.cpp \
|
libremediaserver-audio.cpp \
|
||||||
|
@ -24,23 +23,12 @@ SOURCES += main.cpp \
|
||||||
audiolayerwidget.cpp \
|
audiolayerwidget.cpp \
|
||||||
audiowidget.cpp \
|
audiowidget.cpp \
|
||||||
audiomasterwidget.cpp \
|
audiomasterwidget.cpp \
|
||||||
settings.cpp \
|
settings.cpp
|
||||||
audiodecoder.cpp
|
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
libremediaserver-audio.ui
|
libremediaserver-audio.ui
|
||||||
|
|
||||||
#INCLUDEPATH += ./
|
|
||||||
|
|
||||||
LIBS += -lola -lolacommon
|
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 =
|
RESOURCES =
|
||||||
|
|
||||||
|
@ -51,3 +39,11 @@ OTHER_FILES += \
|
||||||
../compiling.txt \
|
../compiling.txt \
|
||||||
../changelog.txt \
|
../changelog.txt \
|
||||||
../lms-audio.xlm
|
../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
|
||||||
|
|
Loading…
Add table
Reference in a new issue