diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 024f7834..eceeb590 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -137,22 +137,14 @@ set(COCKATRICE_LIBS) # Qt4 stuff if(Qt4_FOUND) - if (NOT QT_QTMULTIMEDIA_FOUND) - FIND_PACKAGE(QtMobility REQUIRED) - endif() - SET(QT_USE_QTNETWORK TRUE) - SET(QT_USE_QTMULTIMEDIA TRUE) SET(QT_USE_QTSVG TRUE) # Include directories INCLUDE(${QT_USE_FILE}) INCLUDE_DIRECTORIES(${QT_INCLUDES}) - INCLUDE_DIRECTORIES(${QT_MOBILITY_INCLUDE_DIR}) - INCLUDE_DIRECTORIES(${QT_MOBILITY_MULTIMEDIAKIT_INCLUDE_DIR}) LIST(APPEND COCKATRICE_LIBS ${QT_LIBRARIES}) LIST(APPEND COCKATRICE_LIBS ${QT_QTMAIN_LIBRARY}) - LIST(APPEND COCKATRICE_LIBS ${QT_MOBILITY_MULTIMEDIAKIT_LIBRARY}) # Let cmake chew Qt4's translations and resource files # Note: header files are MOC-ed automatically by cmake @@ -281,11 +273,11 @@ if(APPLE) set(plugin_dest_dir cockatrice.app/Contents/Plugins) set(qtconf_dest_dir cockatrice.app/Contents/Resources) - # qt4: codecs, iconengines, imageformats, phonon_backend + # qt4: codecs, iconengines, imageformats # qt5: audio, iconengines, imageformats, platforms, printsupport install(DIRECTORY "${QT_PLUGINS_DIR}/" DESTINATION ${plugin_dest_dir} COMPONENT Runtime - FILES_MATCHING REGEX "(audio|codecs|iconengines|imageformats|phonon_backend|platforms|printsupport)/.*\\.dylib" + FILES_MATCHING REGEX "(audio|codecs|iconengines|imageformats|platforms|printsupport)/.*\\.dylib" REGEX ".*_debug\\.dylib" EXCLUDE) install(CODE " @@ -309,11 +301,11 @@ if(WIN32) set(plugin_dest_dir Plugins) set(qtconf_dest_dir .) - # qt4: codecs, iconengines, imageformats, phonon_backend + # qt4: codecs, iconengines, imageformats # qt5: audio, iconengines, imageformats, platforms, printsupport install(DIRECTORY "${QT_PLUGINS_DIR}/" DESTINATION ${plugin_dest_dir} COMPONENT Runtime - FILES_MATCHING REGEX "(audio|codecs|iconengines|imageformats|phonon_backend|platforms|printsupport)/.*[^d]\\.dll") + FILES_MATCHING REGEX "(audio|codecs|iconengines|imageformats|platforms|printsupport)/.*[^d]\\.dll") install(CODE " file(WRITE \"\${CMAKE_INSTALL_PREFIX}/${qtconf_dest_dir}/qt.conf\" \"[Paths] diff --git a/cockatrice/src/chatview.cpp b/cockatrice/src/chatview.cpp index 00dbd3a6..9f77faaf 100644 --- a/cockatrice/src/chatview.cpp +++ b/cockatrice/src/chatview.cpp @@ -11,6 +11,7 @@ #include "pixmapgenerator.h" #include "settingscache.h" #include "tab_userlists.h" +#include "soundengine.h" const QColor DEFAULT_MENTION_COLOR = QColor(194, 31, 47); const QColor OTHER_USER_COLOR = QColor(0, 65, 255); // dark blue @@ -276,6 +277,7 @@ void ChatView::checkMention(QTextCursor &cursor, QString &message, QString &send if (userName.toLower() == fullMentionUpToSpaceOrEnd.toLower()) // Is this user you? { // You have received a valid mention!! + soundEngine->playSound("chat_mention"); mentionFormat.setBackground(QBrush(getCustomMentionColor())); mentionFormat.setForeground(settingsCache->getChatMentionForeground() ? QBrush(Qt::white) : QBrush(Qt::black)); cursor.insertText(mention, mentionFormat); @@ -301,6 +303,7 @@ void ChatView::checkMention(QTextCursor &cursor, QString &message, QString &send if (isModeratorSendingGlobal(userLevel, fullMentionUpToSpaceOrEnd)) { // Moderator Sending Global Message + soundEngine->playSound("all_mention"); mentionFormat.setBackground(QBrush(getCustomMentionColor())); mentionFormat.setForeground(settingsCache->getChatMentionForeground() ? QBrush(Qt::white) : QBrush(Qt::black)); cursor.insertText("@" + fullMentionUpToSpaceOrEnd, mentionFormat); diff --git a/cockatrice/src/dlg_settings.cpp b/cockatrice/src/dlg_settings.cpp index 5e19a273..f75bc50c 100644 --- a/cockatrice/src/dlg_settings.cpp +++ b/cockatrice/src/dlg_settings.cpp @@ -646,7 +646,7 @@ SoundSettingsPage::SoundSettingsPage() connect(soundPathClearButton, SIGNAL(clicked()), this, SLOT(soundPathClearButtonClicked())); QPushButton *soundPathButton = new QPushButton("..."); connect(soundPathButton, SIGNAL(clicked()), this, SLOT(soundPathButtonClicked())); - connect(&soundTestButton, SIGNAL(clicked()), soundEngine, SLOT(playerJoined())); + connect(&soundTestButton, SIGNAL(clicked()), soundEngine, SLOT(testSound())); masterVolumeSlider = new QSlider(Qt::Horizontal); masterVolumeSlider->setMinimum(0); @@ -654,7 +654,7 @@ SoundSettingsPage::SoundSettingsPage() masterVolumeSlider->setValue(settingsCache->getMasterVolume()); masterVolumeSlider->setToolTip(QString::number(settingsCache->getMasterVolume())); connect(settingsCache, SIGNAL(masterVolumeChanged(int)), this, SLOT(masterVolumeChanged(int))); - connect(masterVolumeSlider, SIGNAL(sliderReleased()), soundEngine, SLOT(playerJoined())); + connect(masterVolumeSlider, SIGNAL(sliderReleased()), soundEngine, SLOT(testSound())); connect(masterVolumeSlider, SIGNAL(valueChanged(int)), settingsCache, SLOT(setMasterVolume(int))); diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index 7b76d8b9..127c0d3d 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -37,7 +37,7 @@ bool MessageLogWidget::userIsFemale() const void MessageLogWidget::logGameJoined(int gameId) { - soundEngine->playerJoined(); + soundEngine->playSound("player_join"); if (userIsFemale()) appendHtmlServerMessage(tr("You have joined game #%1.", "female").arg(""+ QString::number(gameId) + "")); else @@ -54,7 +54,7 @@ void MessageLogWidget::logReplayStarted(int gameId) void MessageLogWidget::logJoin(Player *player) { - soundEngine->playerJoined(); + soundEngine->playSound("player_join"); if (isFemale(player)) appendHtmlServerMessage(tr("%1 has joined the game.", "female").arg(sanitizeHtml(player->getName()))); else @@ -63,6 +63,7 @@ void MessageLogWidget::logJoin(Player *player) void MessageLogWidget::logLeave(Player *player) { + soundEngine->playSound("player_leave"); if (isFemale(player)) appendHtmlServerMessage(tr("%1 has left the game.", "female").arg(sanitizeHtml(player->getName()))); else @@ -81,11 +82,13 @@ void MessageLogWidget::logKicked() void MessageLogWidget::logJoinSpectator(QString name) { + soundEngine->playSound("spectator_join"); appendHtmlServerMessage(tr("%1 is now watching the game.").arg(sanitizeHtml(name))); } void MessageLogWidget::logLeaveSpectator(QString name) { + soundEngine->playSound("spectator_leave"); appendHtmlServerMessage(tr("%1 is not watching the game any more.").arg(sanitizeHtml(name))); } @@ -134,6 +137,7 @@ void MessageLogWidget::logSetSideboardLock(Player *player, bool locked) void MessageLogWidget::logConcede(Player *player) { + soundEngine->playSound("player_concede"); if (isFemale(player)) appendHtmlServerMessage(tr("%1 has conceded the game.", "female").arg(sanitizeHtml(player->getName()))); else @@ -148,11 +152,13 @@ void MessageLogWidget::logGameStart() void MessageLogWidget::logConnectionStateChanged(Player *player, bool connectionState) { if (connectionState) { + soundEngine->playSound("player_reconnect"); if (isFemale(player)) appendHtmlServerMessage(tr("%1 has restored connection to the game.", "female").arg(sanitizeHtml(player->getName()))); else appendHtmlServerMessage(tr("%1 has restored connection to the game.", "male").arg(sanitizeHtml(player->getName()))); } else { + soundEngine->playSound("player_disconnect"); if (isFemale(player)) appendHtmlServerMessage(tr("%1 has lost connection to the game.", "female").arg(sanitizeHtml(player->getName()))); else @@ -172,6 +178,7 @@ void MessageLogWidget::logSpectatorSay(QString spectatorName, UserLevelFlags spe void MessageLogWidget::logShuffle(Player *player, CardZone *zone) { + soundEngine->playSound("shuffle"); if (currentContext != MessageContext_Mulligan) { appendHtmlServerMessage((isFemale(player) ? tr("%1 shuffles %2.", "female") @@ -183,6 +190,7 @@ void MessageLogWidget::logShuffle(Player *player, CardZone *zone) void MessageLogWidget::logRollDie(Player *player, int sides, int roll) { + soundEngine->playSound("roll_dice"); if (isFemale(player)) appendHtmlServerMessage(tr("%1 rolls a %2 with a %3-sided die.", "female").arg(sanitizeHtml(player->getName())).arg("" + QString::number(roll) + "").arg("" + QString::number(sides) + "")); else @@ -194,6 +202,7 @@ void MessageLogWidget::logDrawCards(Player *player, int number) if (currentContext == MessageContext_Mulligan) mulliganPlayer = player; else { + soundEngine->playSound("draw_card"); if (isFemale(player)) appendHtmlServerMessage(tr("%1 draws %2 card(s).", "female").arg(sanitizeHtml(player->getName())).arg("" + QString::number(number) + "")); else @@ -296,6 +305,7 @@ void MessageLogWidget::doMoveCard(LogMoveCard &attributes) QString finalStr; if (targetName == "table") { + soundEngine->playSound("play_card"); if (moveCardTapped.value(attributes.card)) finalStr = tr("%1 puts %2 into play tapped%3."); else @@ -318,6 +328,7 @@ void MessageLogWidget::doMoveCard(LogMoveCard &attributes) } else if (targetName == "sb") finalStr = tr("%1 moves %2%3 to sideboard."); else if (targetName == "stack") { + soundEngine->playSound("play_card"); finalStr = tr("%1 plays %2%3."); } @@ -565,7 +576,10 @@ void MessageLogWidget::logSetCardCounter(Player *player, QString cardName, int c void MessageLogWidget::logSetTapped(Player *player, CardItem *card, bool tapped) { - soundEngine->tap(); + if (tapped) + soundEngine->playSound("tap_card"); + else + soundEngine->playSound("untap_card"); if (currentContext == MessageContext_MoveCard) moveCardTapped.insert(card, tapped); @@ -603,6 +617,9 @@ void MessageLogWidget::logSetTapped(Player *player, CardItem *card, bool tapped) void MessageLogWidget::logSetCounter(Player *player, QString counterName, int value, int oldValue) { + if (counterName == "life") + soundEngine->playSound("life_change"); + QString str; if (isFemale(player)) str = tr("%1 sets counter %2 to %3 (%4%5).", "female"); @@ -799,17 +816,17 @@ void MessageLogWidget::logSetActivePhase(int phase) { QString phaseName; switch (phase) { - case 0: phaseName = tr("untap step"); break; - case 1: phaseName = tr("upkeep step"); break; - case 2: phaseName = tr("draw step"); break; - case 3: phaseName = tr("first main phase"); break; - case 4: phaseName = tr("beginning of combat step"); break; - case 5: phaseName = tr("declare attackers step"); soundEngine->attack(); break; - case 6: phaseName = tr("declare blockers step"); break; - case 7: phaseName = tr("combat damage step"); break; - case 8: phaseName = tr("end of combat step"); break; - case 9: phaseName = tr("second main phase"); break; - case 10: phaseName = tr("ending phase"); soundEngine->endStep(); break; + case 0: phaseName = tr("untap step"); soundEngine->playSound("untap_step"); break; + case 1: phaseName = tr("upkeep step"); soundEngine->playSound("upkeep_step"); break; + case 2: phaseName = tr("draw step"); soundEngine->playSound("draw_step"); break; + case 3: phaseName = tr("first main phase"); soundEngine->playSound("main_1"); break; + case 4: phaseName = tr("beginning of combat step"); soundEngine->playSound("start_combat"); break; + case 5: phaseName = tr("declare attackers step"); soundEngine->playSound("attack_step"); break; + case 6: phaseName = tr("declare blockers step"); soundEngine->playSound("block_step"); break; + case 7: phaseName = tr("combat damage step"); soundEngine->playSound("damage_step"); break; + case 8: phaseName = tr("end of combat step"); soundEngine->playSound("end_combat"); break; + case 9: phaseName = tr("second main phase"); soundEngine->playSound("main_2"); break; + case 10: phaseName = tr("ending phase"); soundEngine->playSound("end_step"); break; } appendHtml("" + QDateTime::currentDateTime().toString("[hh:mm:ss] ") + tr("It is now the %1.").arg(phaseName) + ""); } diff --git a/cockatrice/src/soundengine.cpp b/cockatrice/src/soundengine.cpp index e3192726..324c8ba2 100644 --- a/cockatrice/src/soundengine.cpp +++ b/cockatrice/src/soundengine.cpp @@ -1,102 +1,73 @@ #include "soundengine.h" #include "settingscache.h" -#include -#include -#include -#include + +#include +#include + +/* + fileNames = QStringList() + // Phases + << "untap_step" << "upkeep_step" << "draw_step" << "main_1" + << "start_combat" << "attack_step" << "block_step" << "damage_step" << "end_combat" + << "main_2" << "end_step" + // Game Actions + << "draw_card" << "play_card" << "tap_card" << "untap_card" + << "shuffle" << "roll_dice" << "life_change" + // Player + << "player_join" << "player_leave" << "player_disconnect" << "player_reconnect" << "player_concede" + // Spectator + << "spectator_join" << "spectator_leave" + // Chat & UI + << "chat_mention" << "all_mention" << "private_message"; +*/ + +#define TEST_SOUND_FILENAME "player_join" SoundEngine::SoundEngine(QObject *parent) - : QObject(parent), audio(0) +: QObject(parent), enabled(false) { - inputBuffer = new QBuffer(this); - - connect(settingsCache, SIGNAL(soundPathChanged()), this, SLOT(cacheData())); connect(settingsCache, SIGNAL(soundEnabledChanged()), this, SLOT(soundEnabledChanged())); - cacheData(); + soundEnabledChanged(); - - lastTapPlayed = QDateTime::currentDateTime(); - lastEndStepPlayed = QDateTime::currentDateTime(); - lastAttackStepPlayed = QDateTime::currentDateTime(); -} - -void SoundEngine::cacheData() -{ - static const QStringList fileNames = QStringList() - << "end_step" << "tap" << "player_joined" << "attack"; - for (int i = 0; i < fileNames.size(); ++i) { - QFile file(settingsCache->getSoundPath() + "/" + fileNames[i] + ".raw"); - if(!file.exists()) - continue; - file.open(QIODevice::ReadOnly); - audioData.insert(fileNames[i], file.readAll()); - file.close(); - } } void SoundEngine::soundEnabledChanged() { if (settingsCache->getSoundEnabled()) { - qDebug("SoundEngine: enabling sound"); - QAudioFormat format; -#if QT_VERSION < 0x050000 - format.setFrequency(44100); - format.setChannels(1); +#if QT_VERSION < 0x050000 //QT4 + if(QSound::isAvailable()) + { + qDebug("SoundEngine: enabling sound"); + enabled = true; + } else { + qDebug("SoundEngine: sound not available"); + enabled = false; + } #else - format.setSampleRate(44100); - format.setChannelCount(1); + qDebug("SoundEngine: enabling sound"); + enabled = true; #endif - format.setSampleSize(16); - format.setCodec("audio/pcm"); - format.setByteOrder(QAudioFormat::LittleEndian); - format.setSampleType(QAudioFormat::SignedInt); - audio = new QAudioOutput(format, this); - } else if (audio) { + } else { qDebug("SoundEngine: disabling sound"); - audio->stop(); - audio->deleteLater(); - audio = 0; + enabled = false; } } -void SoundEngine::playSound(const QString &fileName) +#include +void SoundEngine::playSound(QString fileName) { - if (!audio) + if(!enabled) return; - - audio->stop(); - inputBuffer->close(); - inputBuffer->setData(audioData[fileName]); - inputBuffer->open(QIODevice::ReadOnly); -#if QT_VERSION >= 0x050000 - audio->setVolume(settingsCache->getMasterVolume() / 100.0); -#endif - audio->start(inputBuffer); - + + QFileInfo fi(settingsCache->getSoundPath() + "/" + fileName + ".wav"); + qDebug() << "playing" << fi.absoluteFilePath(); + if(!fi.exists()) + return; + + QSound::play(fi.absoluteFilePath()); } -void SoundEngine::endStep() +void SoundEngine::testSound() { - if (lastEndStepPlayed.secsTo(QDateTime::currentDateTime()) >= 1) - playSound("end_step"); - lastEndStepPlayed = QDateTime::currentDateTime(); -} - -void SoundEngine::tap() -{ - if (lastTapPlayed.secsTo(QDateTime::currentDateTime()) >= 1) - playSound("tap"); - lastTapPlayed = QDateTime::currentDateTime(); -} - -void SoundEngine::playerJoined() -{ - playSound("player_joined"); -} - - -void SoundEngine::attack() { - if (lastAttackStepPlayed.secsTo(QDateTime::currentDateTime()) >= 1) - playSound("attack"); - lastAttackStepPlayed = QDateTime::currentDateTime(); -} + playSound(TEST_SOUND_FILENAME); +} \ No newline at end of file diff --git a/cockatrice/src/soundengine.h b/cockatrice/src/soundengine.h index fb1cbd73..3ab2ed8f 100644 --- a/cockatrice/src/soundengine.h +++ b/cockatrice/src/soundengine.h @@ -2,34 +2,19 @@ #define SOUNDENGINE_H #include -#include -#include - -class QAudioOutput; -class QBuffer; class SoundEngine : public QObject { Q_OBJECT private: - void playSound(const QString &fileName); - QMap audioData; - QBuffer *inputBuffer; - QAudioOutput *audio; - QDateTime lastTapPlayed; - QDateTime lastEndStepPlayed; - QDateTime lastAttackStepPlayed; + bool enabled; private slots: - void cacheData(); void soundEnabledChanged(); public: SoundEngine(QObject *parent = 0); + void playSound(QString fileName); public slots: - void endStep(); - void tap(); - void playerJoined(); - void attack(); + void testSound(); }; extern SoundEngine *soundEngine; - #endif diff --git a/cockatrice/src/tab_message.cpp b/cockatrice/src/tab_message.cpp index 4bc20ed0..61a23fc6 100644 --- a/cockatrice/src/tab_message.cpp +++ b/cockatrice/src/tab_message.cpp @@ -3,13 +3,14 @@ #include #include #include +#include +#include #include "tab_message.h" #include "abstractclient.h" #include "chatview.h" #include "main.h" #include "settingscache.h" -#include -#include +#include "soundengine.h" #include "pending_command.h" #include "pb/session_commands.pb.h" @@ -111,6 +112,8 @@ void TabMessage::processUserMessageEvent(const Event_UserMessage &event) { const UserLevelFlags userLevel(event.sender_name() == otherUserInfo->name() ? otherUserInfo->user_level() : ownUserInfo->user_level()); chatView->appendMessage(QString::fromStdString(event.message()), QString::fromStdString(event.sender_name()), userLevel, true); + if (tabSupervisor->currentIndex() != tabSupervisor->indexOf(this)) + soundEngine->playSound("private_message"); if (settingsCache->getShowMessagePopup() && shouldShowSystemPopup(event)) showSystemPopup(event); diff --git a/sounds/CMakeLists.txt b/sounds/CMakeLists.txt index cd9f6c33..7712abb9 100644 --- a/sounds/CMakeLists.txt +++ b/sounds/CMakeLists.txt @@ -2,7 +2,7 @@ # # Installs default sound files -FILE(GLOB sounds "${CMAKE_CURRENT_SOURCE_DIR}/*.raw") +FILE(GLOB sounds "${CMAKE_CURRENT_SOURCE_DIR}/*.wav") if(UNIX) if(APPLE) diff --git a/sounds/attack.raw b/sounds/attack.raw deleted file mode 100644 index d9edd2a2..00000000 Binary files a/sounds/attack.raw and /dev/null differ diff --git a/sounds/attack_step.wav b/sounds/attack_step.wav new file mode 100644 index 00000000..e604155d Binary files /dev/null and b/sounds/attack_step.wav differ diff --git a/sounds/end_step.raw b/sounds/end_step.raw deleted file mode 100644 index 7ae52545..00000000 Binary files a/sounds/end_step.raw and /dev/null differ diff --git a/sounds/end_step.wav b/sounds/end_step.wav new file mode 100644 index 00000000..eb58dffb Binary files /dev/null and b/sounds/end_step.wav differ diff --git a/sounds/player_join.wav b/sounds/player_join.wav new file mode 100644 index 00000000..3289155e Binary files /dev/null and b/sounds/player_join.wav differ diff --git a/sounds/player_joined.raw b/sounds/player_joined.raw deleted file mode 100644 index d3294958..00000000 Binary files a/sounds/player_joined.raw and /dev/null differ diff --git a/sounds/start_combat.raw b/sounds/start_combat.raw deleted file mode 100644 index d9edd2a2..00000000 Binary files a/sounds/start_combat.raw and /dev/null differ diff --git a/sounds/start_combat.wav b/sounds/start_combat.wav new file mode 100644 index 00000000..e604155d Binary files /dev/null and b/sounds/start_combat.wav differ diff --git a/sounds/tap.raw b/sounds/tap.raw deleted file mode 100644 index 179f0cf0..00000000 Binary files a/sounds/tap.raw and /dev/null differ diff --git a/sounds/tap_card.wav b/sounds/tap_card.wav new file mode 100644 index 00000000..62f56a8c Binary files /dev/null and b/sounds/tap_card.wav differ diff --git a/travis-dependencies.sh b/travis-dependencies.sh index 63fdc24c..cd86a892 100755 --- a/travis-dependencies.sh +++ b/travis-dependencies.sh @@ -10,7 +10,7 @@ if [[ $TRAVIS_OS_NAME == "osx" ]] ; then else if (( QT4 )); then sudo apt-get update -qq - sudo apt-get install -y qtmobility-dev libprotobuf-dev protobuf-compiler libqt4-dev + sudo apt-get install -y libprotobuf-dev protobuf-compiler libqt4-dev else sudo add-apt-repository -y ppa:beineri/opt-qt521 sudo add-apt-repository -y ppa:kalakris/cmake