From 81eaac46c722428c999c38caefe9e3238042a603 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 12 Feb 2014 08:35:27 +0100 Subject: [PATCH] * Added new preference option to enable sound in game and other sounds separately. --- .../src/main/java/mage/client/MageFrame.form | 4 +- .../src/main/java/mage/client/MageFrame.java | 2 +- .../mage/client/combat/CombatManager.java | 2 +- .../components/ext/dlg/impl/ChoiceDialog.java | 2 +- .../collection/viewer/MageBook.java | 2 +- .../mage/client/dialog/GameEndDialog.java | 2 +- .../mage/client/dialog/PreferencesDialog.form | 60 +++- .../mage/client/dialog/PreferencesDialog.java | 109 ++++++-- .../client/dialog/TableWaitingDialog.java | 2 +- .../mage/client/game/BattlefieldPanel.java | 2 +- .../java/mage/client/game/FeedbackPanel.java | 2 +- .../client/remote/CallbackClientImpl.java | 2 +- .../java/mage/client/util/AudioManager.java | 219 --------------- .../java/mage/client/util/MusicPlayer.java | 156 ----------- .../mage/client/util/audio/AudioGroup.java | 10 + .../mage/client/util/audio/AudioManager.java | 256 ++++++++++++++++++ .../java/mage/client/util/audio/MageClip.java | 55 ++++ .../mage/client/util/audio/MusicPlayer.java | 169 ++++++++++++ .../java/org/mage/card/arcane/CardPanel.java | 2 +- Mage/src/mage/players/PlayerImpl.java | 2 +- 20 files changed, 628 insertions(+), 432 deletions(-) delete mode 100644 Mage.Client/src/main/java/mage/client/util/AudioManager.java delete mode 100644 Mage.Client/src/main/java/mage/client/util/MusicPlayer.java create mode 100644 Mage.Client/src/main/java/mage/client/util/audio/AudioGroup.java create mode 100644 Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java create mode 100644 Mage.Client/src/main/java/mage/client/util/audio/MageClip.java create mode 100644 Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.form b/Mage.Client/src/main/java/mage/client/MageFrame.form index bbe38d41da5..ffeecb63fc1 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.form +++ b/Mage.Client/src/main/java/mage/client/MageFrame.form @@ -52,7 +52,9 @@ - + + + diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 582c02e358d..83379b706a0 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -113,8 +113,8 @@ import mage.client.remote.CallbackClientImpl; import mage.client.table.TablesPane; import mage.client.tournament.TournamentPane; import mage.client.util.EDTExceptionHandler; -import mage.client.util.MusicPlayer; import mage.client.util.SettingsManager; +import mage.client.util.audio.MusicPlayer; import mage.client.util.gui.ArrowBuilder; import mage.components.ImagePanel; import mage.interfaces.MageClient; diff --git a/Mage.Client/src/main/java/mage/client/combat/CombatManager.java b/Mage.Client/src/main/java/mage/client/combat/CombatManager.java index 9b39f203edb..48b76232858 100644 --- a/Mage.Client/src/main/java/mage/client/combat/CombatManager.java +++ b/Mage.Client/src/main/java/mage/client/combat/CombatManager.java @@ -3,7 +3,7 @@ package mage.client.combat; import mage.cards.MagePermanent; import mage.client.MageFrame; import mage.client.game.PlayAreaPanel; -import mage.client.util.AudioManager; +import mage.client.util.audio.AudioManager; import mage.client.util.SettingsManager; import mage.client.util.gui.ArrowBuilder; import mage.view.CardView; diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/ChoiceDialog.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/ChoiceDialog.java index 5567d8b59c0..19ac164198b 100644 --- a/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/ChoiceDialog.java +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/ChoiceDialog.java @@ -9,7 +9,7 @@ import mage.client.components.ext.dlg.DialogManager; import mage.client.components.ext.dlg.DlgParams; import mage.client.components.ext.dlg.IDialogPanel; import mage.client.plugins.impl.Plugins; -import mage.client.util.AudioManager; +import mage.client.util.audio.AudioManager; import mage.client.util.Command; import mage.client.util.SettingsManager; import mage.view.CardView; diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java index c4847696d39..257f63e42c3 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java @@ -39,7 +39,7 @@ import mage.client.MageFrame; import mage.client.cards.BigCard; import mage.client.components.HoverButton; import mage.client.plugins.impl.Plugins; -import mage.client.util.AudioManager; +import mage.client.util.audio.AudioManager; import mage.client.util.Command; import mage.client.util.Config; import mage.client.util.ImageHelper; diff --git a/Mage.Client/src/main/java/mage/client/dialog/GameEndDialog.java b/Mage.Client/src/main/java/mage/client/dialog/GameEndDialog.java index 3d912880b6e..3440a44b11b 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/GameEndDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/GameEndDialog.java @@ -49,7 +49,7 @@ import javax.swing.JLayeredPane; import javax.swing.JOptionPane; import mage.client.MageFrame; import mage.client.game.GamePanel; -import mage.client.util.AudioManager; +import mage.client.util.audio.AudioManager; import mage.client.util.Format; import mage.client.util.ImageHelper; import mage.client.util.gui.BufferedImageBuilder; diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form index 04d4a579ef1..b05eb2f917c 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form @@ -66,13 +66,13 @@ - + - - + + - + @@ -82,10 +82,10 @@ - + - - + + @@ -171,7 +171,7 @@ - + @@ -184,6 +184,22 @@ + + + + + + + + + + + + + + + + @@ -731,8 +747,8 @@ - - + + @@ -745,7 +761,7 @@ - + @@ -769,13 +785,13 @@ - + - - + + - + @@ -783,6 +799,20 @@ + + + + + + + + + + + + + + diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index f561a43f837..19e55015950 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -74,10 +74,13 @@ import org.apache.log4j.Logger; */ public class PreferencesDialog extends javax.swing.JDialog { + private static final transient Logger log = Logger.getLogger(PreferencesDialog.class); + public static final String KEY_SHOW_TOOLTIPS_ANY_ZONE = "showTooltipsInAnyZone"; public static final String KEY_HAND_USE_BIG_CARDS = "handUseBigCards"; public static final String KEY_PERMANENTS_IN_ONE_PILE = "nonLandPermanentsInOnePile"; public static final String KEY_SHOW_PLAYER_NAMES_PERMANENTLY = "showPlayerNamesPermanently"; + public static final String KEY_SHOW_ABILITY_PICKER = "showAbilityPicker"; public static final String KEY_GAME_LOG_AUTO_SAVE = "gameLogAutoSave"; public static final String KEY_CARD_IMAGES_USE_DEFAULT = "cardImagesUseDefault"; @@ -91,7 +94,8 @@ public class PreferencesDialog extends javax.swing.JDialog { public static final String KEY_BATTLEFIELD_IMAGE_RANDOM = "battlefieldImagerandom"; public static final String KEY_BATTLEFIELD_IMAGE_DEFAULT = "battlefieldImageDefault"; - public static final String KEY_SOUNDS_ON = "soundsOn"; + public static final String KEY_SOUNDS_GAME_ON = "soundsOn"; + public static final String KEY_SOUNDS_OTHER_ON = "soundsOtherOn"; public static final String KEY_SOUNDS_MATCH_MUSIC_ON = "soundsMatchMusicOn"; public static final String KEY_SOUNDS_MATCH_MUSIC_PATH = "soundsMatchMusicPath"; @@ -173,17 +177,18 @@ public class PreferencesDialog extends javax.swing.JDialog { public static final String KEY_AVATAR = "selectedId"; - private static Map cache = new HashMap(); + private static final Map cache = new HashMap(); + private static final Boolean UPDATE_CACHE_POLICY = Boolean.TRUE; public static final String OPEN_CONNECTION_TAB = "Open-Connection-Tab"; - private static final transient Logger log = Logger.getLogger(PreferencesDialog.class); + public static final int DEFAULT_AVATAR_ID = 51; private static int selectedAvatarId = DEFAULT_AVATAR_ID; private static final Set available_avatars = new HashSet(); - private static Map panels = new HashMap(); + private static final Map panels = new HashMap(); private static final Border GREEN_BORDER = BorderFactory.createLineBorder(Color.GREEN, 3); private static final Border BLACK_BORDER = BorderFactory.createLineBorder(Color.BLACK, 3); @@ -267,6 +272,7 @@ public class PreferencesDialog extends javax.swing.JDialog { main_game = new javax.swing.JPanel(); nonLandPermanentsInOnePile = new javax.swing.JCheckBox(); showPlayerNamesPermanently = new javax.swing.JCheckBox(); + showAbilityPickerForSimpleAbilities = new javax.swing.JCheckBox(); main_gamelog = new javax.swing.JPanel(); cbGameLogAutoSave = new javax.swing.JCheckBox(); tabPhases = new javax.swing.JPanel(); @@ -313,7 +319,8 @@ public class PreferencesDialog extends javax.swing.JDialog { jLabel15 = new javax.swing.JLabel(); tabSounds = new javax.swing.JPanel(); sounds_clips = new javax.swing.JPanel(); - cbEnableSounds = new javax.swing.JCheckBox(); + cbEnableGameSounds = new javax.swing.JCheckBox(); + cbEnableOtherSounds = new javax.swing.JCheckBox(); sounds_backgroundMusic = new javax.swing.JPanel(); cbEnableBattlefieldBGM = new javax.swing.JCheckBox(); jLabel16 = new javax.swing.JLabel(); @@ -390,7 +397,7 @@ public class PreferencesDialog extends javax.swing.JDialog { nonLandPermanentsInOnePileActionPerformed(evt); } }); - main_game.add(nonLandPermanentsInOnePile, java.awt.BorderLayout.CENTER); + main_game.add(nonLandPermanentsInOnePile, java.awt.BorderLayout.PAGE_START); nonLandPermanentsInOnePile.getAccessibleContext().setAccessibleName("nonLandPermanentsInOnePile"); showPlayerNamesPermanently.setSelected(true); @@ -401,7 +408,18 @@ public class PreferencesDialog extends javax.swing.JDialog { showPlayerNamesPermanentlyActionPerformed(evt); } }); - main_game.add(showPlayerNamesPermanently, java.awt.BorderLayout.PAGE_END); + main_game.add(showPlayerNamesPermanently, java.awt.BorderLayout.LINE_START); + + showAbilityPickerForSimpleAbilities.setSelected(true); + showAbilityPickerForSimpleAbilities.setText("Show ability picker for abilities without costs"); + showAbilityPickerForSimpleAbilities.setToolTipText("This prevents that you accidently activate abilities without costs that e.g. tap the permanent."); + showAbilityPickerForSimpleAbilities.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); + showAbilityPickerForSimpleAbilities.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + showAbilityPickerForSimpleAbilitiesActionPerformed(evt); + } + }); + main_game.add(showAbilityPickerForSimpleAbilities, java.awt.BorderLayout.PAGE_END); main_gamelog.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Game log")); main_gamelog.setLayout(new java.awt.BorderLayout()); @@ -423,8 +441,8 @@ public class PreferencesDialog extends javax.swing.JDialog { .addContainerGap() .addGroup(tabMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(main_card, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(main_game, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 533, Short.MAX_VALUE)) + .addComponent(main_game, javax.swing.GroupLayout.DEFAULT_SIZE, 533, Short.MAX_VALUE) + .addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); tabMainLayout.setVerticalGroup( @@ -433,10 +451,10 @@ public class PreferencesDialog extends javax.swing.JDialog { .addContainerGap() .addComponent(main_card, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(main_gamelog, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(188, Short.MAX_VALUE)) + .addComponent(main_gamelog, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(153, Short.MAX_VALUE)) ); main_card.getAccessibleContext().setAccessibleName("Game panel"); @@ -766,14 +784,23 @@ public class PreferencesDialog extends javax.swing.JDialog { sounds_clips.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Clips")); sounds_clips.setLayout(new java.awt.BorderLayout()); - cbEnableSounds.setToolTipText("Sounds that will be played for certain actions (e.g. play land, attack, etc.)"); - cbEnableSounds.setLabel("Enable"); - cbEnableSounds.addActionListener(new java.awt.event.ActionListener() { + cbEnableGameSounds.setText("Enable game sounds"); + cbEnableGameSounds.setToolTipText("Sounds that will be played for certain actions (e.g. play land, attack, etc.) during the game."); + cbEnableGameSounds.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - cbEnableSoundsActionPerformed(evt); + cbEnableGameSoundsActionPerformed(evt); } }); - sounds_clips.add(cbEnableSounds, java.awt.BorderLayout.CENTER); + sounds_clips.add(cbEnableGameSounds, java.awt.BorderLayout.CENTER); + + cbEnableOtherSounds.setText("Enable other sounds"); + cbEnableOtherSounds.setToolTipText("Sounds that will be played for actions outside of games (e.g. whisper, player joins your game, player submits a deck ...)."); + cbEnableOtherSounds.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbEnableOtherSoundsActionPerformed(evt); + } + }); + sounds_clips.add(cbEnableOtherSounds, java.awt.BorderLayout.PAGE_END); sounds_backgroundMusic.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Music")); @@ -835,8 +862,8 @@ public class PreferencesDialog extends javax.swing.JDialog { .addGroup(tabSoundsLayout.createSequentialGroup() .addContainerGap() .addGroup(tabSoundsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(sounds_clips, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(sounds_backgroundMusic, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(sounds_clips, javax.swing.GroupLayout.DEFAULT_SIZE, 533, Short.MAX_VALUE) + .addComponent(sounds_backgroundMusic, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); tabSoundsLayout.setVerticalGroup( @@ -846,7 +873,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .addComponent(sounds_clips, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(sounds_backgroundMusic, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(254, Short.MAX_VALUE)) + .addContainerGap(229, Short.MAX_VALUE)) ); sounds_clips.getAccessibleContext().setAccessibleDescription(""); @@ -1288,6 +1315,7 @@ public class PreferencesDialog extends javax.swing.JDialog { save(prefs, dialog.displayBigCardsInHand, KEY_HAND_USE_BIG_CARDS, "true", "false", UPDATE_CACHE_POLICY); save(prefs, dialog.nonLandPermanentsInOnePile, KEY_PERMANENTS_IN_ONE_PILE, "true", "false", UPDATE_CACHE_POLICY); save(prefs, dialog.showPlayerNamesPermanently, KEY_SHOW_PLAYER_NAMES_PERMANENTLY, "true", "false", UPDATE_CACHE_POLICY); + save(prefs, dialog.showAbilityPickerForSimpleAbilities, KEY_SHOW_ABILITY_PICKER, "true", "false", UPDATE_CACHE_POLICY); save(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY); // Phases @@ -1318,7 +1346,8 @@ public class PreferencesDialog extends javax.swing.JDialog { save(prefs, dialog.cbUseRandomBattleImage, KEY_BATTLEFIELD_IMAGE_RANDOM, "true", "false", UPDATE_CACHE_POLICY); // sounds - save(prefs, dialog.cbEnableSounds, KEY_SOUNDS_ON, "true", "false", UPDATE_CACHE_POLICY); + save(prefs, dialog.cbEnableGameSounds, KEY_SOUNDS_GAME_ON, "true", "false", UPDATE_CACHE_POLICY); + save(prefs, dialog.cbEnableOtherSounds, KEY_SOUNDS_OTHER_ON, "true", "false", UPDATE_CACHE_POLICY); save(prefs, dialog.cbEnableBattlefieldBGM, KEY_SOUNDS_MATCH_MUSIC_ON, "true", "false", UPDATE_CACHE_POLICY); saveSoundPath(prefs); @@ -1404,9 +1433,9 @@ public class PreferencesDialog extends javax.swing.JDialog { // TODO add your handling code here: }//GEN-LAST:event_cbCheckForNewImagesActionPerformed - private void cbEnableSoundsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbEnableSoundsActionPerformed + private void cbEnableGameSoundsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbEnableGameSoundsActionPerformed // TODO add your handling code here: - }//GEN-LAST:event_cbEnableSoundsActionPerformed + }//GEN-LAST:event_cbEnableGameSoundsActionPerformed private void cbEnableBattlefieldBGMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbEnableBattlefieldBGMActionPerformed if(cbEnableBattlefieldBGM.isSelected()){ @@ -1545,6 +1574,14 @@ public class PreferencesDialog extends javax.swing.JDialog { }//GEN-LAST:event_showToolTipsInAnyZoneActionPerformed + private void showAbilityPickerForSimpleAbilitiesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showAbilityPickerForSimpleAbilitiesActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_showAbilityPickerForSimpleAbilitiesActionPerformed + + private void cbEnableOtherSoundsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbEnableOtherSoundsActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_cbEnableOtherSoundsActionPerformed + private void showProxySettings() { if (cbProxyType.getSelectedItem() == Connection.ProxyType.SOCKS) { this.pnlProxy.setVisible(true); @@ -1575,6 +1612,7 @@ public class PreferencesDialog extends javax.swing.JDialog { } final int openedTab = param; java.awt.EventQueue.invokeLater(new Runnable() { + @Override public void run() { if (!dialog.isVisible()) { Preferences prefs = MageFrame.getPreferences(); @@ -1628,6 +1666,7 @@ public class PreferencesDialog extends javax.swing.JDialog { load(prefs, dialog.showToolTipsInAnyZone, KEY_SHOW_TOOLTIPS_ANY_ZONE, "true"); load(prefs, dialog.nonLandPermanentsInOnePile, KEY_PERMANENTS_IN_ONE_PILE, "true"); load(prefs, dialog.showPlayerNamesPermanently, KEY_SHOW_PLAYER_NAMES_PERMANENTLY, "true"); + load(prefs, dialog.showAbilityPickerForSimpleAbilities, KEY_SHOW_ABILITY_PICKER, "true"); load(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true"); } @@ -1682,11 +1721,17 @@ public class PreferencesDialog extends javax.swing.JDialog { } private static void loadSoundSettings(Preferences prefs) { - String prop = prefs.get(KEY_SOUNDS_ON, "true"); + String prop = prefs.get(KEY_SOUNDS_GAME_ON, "true"); if (prop.equals("true")) { - dialog.cbEnableSounds.setSelected(true); + dialog.cbEnableGameSounds.setSelected(true); } else { - dialog.cbEnableSounds.setSelected(false); + dialog.cbEnableGameSounds.setSelected(false); + } + prop = prefs.get(KEY_SOUNDS_OTHER_ON, "true"); + if (prop.equals("true")) { + dialog.cbEnableOtherSounds.setSelected(true); + } else { + dialog.cbEnableOtherSounds.setSelected(false); } // Match music @@ -1830,7 +1875,9 @@ public class PreferencesDialog extends javax.swing.JDialog { } else { Preferences prefs = MageFrame.getPreferences(); String value = prefs.get(key, def); - if (value == null) return null; + if (value == null) { + return null; + } cache.put(key, value); return value; } @@ -1877,8 +1924,8 @@ public class PreferencesDialog extends javax.swing.JDialog { for (JPanel panel : panels.values()) { panel.setBorder(BLACK_BORDER); } - this.selectedAvatarId = id; - panels.get(this.selectedAvatarId).setBorder(GREEN_BORDER); + PreferencesDialog.selectedAvatarId = id; + panels.get(PreferencesDialog.selectedAvatarId).setBorder(GREEN_BORDER); } } @@ -1923,7 +1970,8 @@ public class PreferencesDialog extends javax.swing.JDialog { private javax.swing.JButton btnBrowseImageLocation; private javax.swing.JCheckBox cbCheckForNewImages; private javax.swing.JCheckBox cbEnableBattlefieldBGM; - private javax.swing.JCheckBox cbEnableSounds; + private javax.swing.JCheckBox cbEnableGameSounds; + private javax.swing.JCheckBox cbEnableOtherSounds; private javax.swing.JCheckBox cbGameLogAutoSave; private javax.swing.JComboBox cbProxyType; private javax.swing.JCheckBox cbSaveToZipFiles; @@ -1992,6 +2040,7 @@ public class PreferencesDialog extends javax.swing.JDialog { private javax.swing.JPanel pnlProxySettings; private javax.swing.JCheckBox rememberPswd; private javax.swing.JButton saveButton; + private javax.swing.JCheckBox showAbilityPickerForSimpleAbilities; private javax.swing.JCheckBox showPlayerNamesPermanently; private javax.swing.JCheckBox showToolTipsInAnyZone; private javax.swing.JPanel sounds_backgroundMusic; diff --git a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java index 210ad8438b0..6eae9b77879 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java @@ -44,7 +44,7 @@ import mage.client.MageFrame; import mage.client.chat.ChatPanel; import mage.client.components.MageComponents; import mage.client.components.tray.MageTray; -import mage.client.util.AudioManager; +import mage.client.util.audio.AudioManager; import mage.remote.Session; import mage.view.SeatView; import mage.view.TableView; diff --git a/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java b/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java index 5779c881af3..ac3c671bc60 100644 --- a/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java @@ -56,7 +56,7 @@ import mage.cards.MagePermanent; import mage.client.cards.BigCard; import mage.client.cards.Permanent; import mage.client.plugins.impl.Plugins; -import mage.client.util.AudioManager; +import mage.client.util.audio.AudioManager; import mage.client.util.Config; import mage.constants.CardType; import mage.view.PermanentView; diff --git a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java index bcaa9d642f0..84c47246b59 100644 --- a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java @@ -46,7 +46,7 @@ import mage.client.MageFrame; import mage.client.chat.ChatPanel; import mage.client.components.MageTextArea; import mage.client.dialog.MageDialog; -import mage.client.util.AudioManager; +import mage.client.util.audio.AudioManager; import mage.client.util.gui.ArrowBuilder; import mage.remote.Session; import org.apache.log4j.Logger; diff --git a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java index a2479d6f98b..0d81fb21cce 100644 --- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java +++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java @@ -38,7 +38,7 @@ import mage.client.constants.Constants.DeckEditorMode; import mage.client.draft.DraftPanel; import mage.client.game.GamePanel; import mage.client.plugins.impl.Plugins; -import mage.client.util.AudioManager; +import mage.client.util.audio.AudioManager; import mage.client.util.DeckUtil; import mage.client.util.GameManager; import mage.client.util.object.SaveObjectUtil; diff --git a/Mage.Client/src/main/java/mage/client/util/AudioManager.java b/Mage.Client/src/main/java/mage/client/util/AudioManager.java deleted file mode 100644 index ad1417e53d3..00000000000 --- a/Mage.Client/src/main/java/mage/client/util/AudioManager.java +++ /dev/null @@ -1,219 +0,0 @@ -package mage.client.util; - -import java.io.File; -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.Clip; -import javax.sound.sampled.DataLine; -import mage.client.constants.Constants; -import mage.client.dialog.PreferencesDialog; -import org.apache.log4j.Logger; - -/** - * Manager class for playing audio files. - * - * @author nantuko - */ -public class AudioManager { - - private static final Logger log = Logger.getLogger(AudioManager.class); - - /** - * AudioManager singleton. - */ - private static AudioManager audioManager = null; - - - public static AudioManager getManager() { - if (audioManager == null) { - audioManager = new AudioManager(); - audioManager.nextPageClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPrevPage.wav"); //sounds better than OnNextPage - audioManager.prevPageClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPrevPage.wav"); - audioManager.anotherTabClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnNextPage.wav"); - audioManager.nextPhaseClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnNextPhase.wav"); - audioManager.endTurnClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnEndTurn.wav"); - audioManager.tapPermanentClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnTapPermanent.wav"); - audioManager.summonClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnSummon.wav"); - audioManager.diedCreatureClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnSummon-.wav"); - audioManager.drawClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnDraw.wav"); - audioManager.buttonOkClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnButtonOk.wav"); - audioManager.buttonCancelClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnButtonCancel.wav"); - audioManager.attackClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAttack.wav"); - audioManager.blockClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnBlock.wav"); - audioManager.addPermanentClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAddPermanent.wav"); - audioManager.addArtifactClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAddArtifact.wav"); - audioManager.updateStackClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnStackNew.wav"); - audioManager.onHover = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnHover.wav"); - - audioManager.playerJoinedTable = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerJoinedTable.wav"); - audioManager.playerSubmittedDeck = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerSubmittedDeck.wav"); - audioManager.playerWhispered = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerWhispered.wav"); - audioManager.playerLeft = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerLeft.wav"); - audioManager.playerWon = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerWon.wav"); - audioManager.playerLost = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerLost.wav"); - } - return audioManager; - } - - public static void playNextPage() { - checkAndPlayClip(getManager().nextPageClip); - } - - public static void playPrevPage() { - checkAndPlayClip(getManager().prevPageClip); - } - - public static void playAnotherTab() { - checkAndPlayClip(getManager().anotherTabClip); - } - - public static void playNextPhase() { - checkAndPlayClip(getManager().nextPhaseClip); - } - - public static void playEndTurn() { - checkAndPlayClip(getManager().endTurnClip); - } - - public static void playTapPermanent() { - checkAndPlayClip(getManager().tapPermanentClip); - } - - public static void playSummon() { - checkAndPlayClip(getManager().summonClip); - } - - public static void playDiedCreature() { - checkAndPlayClip(getManager().diedCreatureClip); - } - - public static void playDraw() { - checkAndPlayClip(getManager().drawClip); - } - - public static void playButtonOk() { - checkAndPlayClip(getManager().buttonOkClip); - } - - public static void playButtonCancel() { - checkAndPlayClip(getManager().buttonCancelClip); - } - - public static void playAttack() { - checkAndPlayClip(getManager().attackClip); - } - - public static void playBlock() { - checkAndPlayClip(getManager().blockClip); - } - - public static void playAddPermanent() { - checkAndPlayClip(getManager().addPermanentClip); - } - - public static void playAddArtifact() { - checkAndPlayClip(getManager().addArtifactClip); - } - - public static void playStackNew() { - checkAndPlayClip(getManager().updateStackClip); - } - - public static void playOnHover() { - checkAndPlayClip(getManager().onHover); - } - - public static void playPlayerJoinedTable() { - checkAndPlayClip(getManager().playerJoinedTable); - } - - public static void playPlayerWhispered() { - checkAndPlayClip(getManager().playerWhispered); - } - - public static void playPlayerSubmittedDeck() { - checkAndPlayClip(getManager().playerSubmittedDeck); - } - - public static void playPlayerLeft() { - checkAndPlayClip(getManager().playerLeft); - } - - public static void playPlayerLost() { - checkAndPlayClip(getManager().playerLost); - } - - public static void playPlayerWon() { - checkAndPlayClip(getManager().playerWon); - } - - private static void checkAndPlayClip(Clip clip) { - try { - if (clip != null) { - String soundsOn = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_ON, "true"); - if (soundsOn.equals("true")) { - audioManager.play(clip); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void play(final Clip clip) { - new Thread(new Runnable() { - public void run() { - clip.setFramePosition(0); - clip.start(); - } - }).run(); - } - - private Clip loadClip(String filename) { - try { - File soundFile = new File(filename); - AudioInputStream soundIn = AudioSystem - .getAudioInputStream(soundFile); - AudioFormat format = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, AudioSystem.NOT_SPECIFIED, - 16, 2, 4, AudioSystem.NOT_SPECIFIED, true); - DataLine.Info info = new DataLine.Info(Clip.class, format); - - Clip clip = (Clip) AudioSystem.getLine(info); - clip.open(soundIn); - - return clip; - } catch (Exception e) { - //e.printStackTrace(); - log.error("Couldn't load sound: " + filename + "."); - } - - return null; - } - - private Clip nextPageClip = null; - private Clip prevPageClip = null; - private Clip anotherTabClip = null; - private Clip nextPhaseClip = null; - private Clip endTurnClip = null; - private Clip tapPermanentClip = null; - private Clip summonClip = null; - private Clip diedCreatureClip = null; - private Clip drawClip = null; - private Clip buttonOkClip = null; - private Clip buttonCancelClip = null; - private Clip attackClip = null; - private Clip blockClip = null; - private Clip addPermanentClip = null; - private Clip addArtifactClip = null; - private Clip updateStackClip = null; - private Clip onHover = null; - - private Clip playerJoinedTable = null; - private Clip playerSubmittedDeck = null; - private Clip playerWhispered = null; - private Clip playerLeft = null; - private Clip playerWon = null; - private Clip playerLost = null; -} diff --git a/Mage.Client/src/main/java/mage/client/util/MusicPlayer.java b/Mage.Client/src/main/java/mage/client/util/MusicPlayer.java deleted file mode 100644 index 5079e56c3be..00000000000 --- a/Mage.Client/src/main/java/mage/client/util/MusicPlayer.java +++ /dev/null @@ -1,156 +0,0 @@ -package mage.client.util; -import java.io.File; -import java.awt.List; -import javax.sound.sampled.*; -import mage.client.constants.Constants; -import mage.client.dialog.PreferencesDialog; -import org.apache.log4j.Logger; - -/** - * - * @author renli - */ - -public class MusicPlayer { - private static final Logger log = Logger.getLogger(AudioManager.class); - String filepath; - String filename; - List filelist = new List(); - static MusicPlayer player = null; - - - //open file and add list - private boolean open(){ - String path = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_MATCH_MUSIC_PATH, "true"); - filepath = path + File.separator; - if(path == null) filepath = Constants.BASE_MUSICS_PATH; - filelist.removeAll(); - File filedir = new File(filepath); - File[] fileread = filedir.listFiles(); - if(fileread == null) return false; - if(fileread.length == 0)return false; - String filename; - for(File f:fileread){ - filename = f.getName().toLowerCase(); - if(filename.endsWith(".mp3") || filename.endsWith(".wav")){ - filelist.add(filename); - } - } - if(filelist.getItemCount() == 0) return false; - return true; - } - - public static void playBGM(){ - stopBGM(); - if(player == null){ - player = new MusicPlayer(); - } - if(player.open()){ - player.play(); - } - } - - public void play(){ - String soundsOn = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_MATCH_MUSIC_ON, "true"); - if(soundsOn.equals("true")){ - player.breaked = false; - player.breaked_out = false; - player.stopped = false; - Thread player = new Thread(new playerThread()); - player.start(); - } - } - - public static void stopBGM(){ - if(player != null){ - player.stopped = true; - player.breaked_out = true; - player.breaked = true; - try { - Thread.sleep(100); - } catch (Exception e) { - log.error("Thread error: " + e); - } - } - } - - public volatile boolean breaked = false; - public volatile boolean breaked_out = false; - public volatile boolean stopped = false; - public volatile FloatControl volume; - AudioInputStream audioInputStream; - AudioFormat audioFormat; - SourceDataLine sourceDataLine; - - - class playerThread extends Thread{ - private void load(File file){ - try{ - audioInputStream = AudioSystem.getAudioInputStream(file); - audioFormat = audioInputStream.getFormat(); - // mp3 decode - if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) { - audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, - audioFormat.getSampleRate(), 16, audioFormat.getChannels(), audioFormat.getChannels() * 2, - audioFormat.getSampleRate(), false); - audioInputStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream); - } - //output - DataLine.Info dataLineInfo = new DataLine.Info( - SourceDataLine.class, audioFormat, - AudioSystem.NOT_SPECIFIED); - sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); - sourceDataLine.open(audioFormat); - volume = (FloatControl)sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN); - sourceDataLine.start(); - }catch(Exception e){ - log.error("Couldn't load file: " + file + " " + e); - } - - } - - public void run(){ - try { - Thread.sleep(100); - } catch (Exception e) { - } - while(!stopped){ - int it = (int)Math.abs(Math.random()*(filelist.getItemCount())); - File file = new File(filepath + filelist.getItem(it)); - load(file); - Thread PlayThread = new Thread(new PlayThread()); - PlayThread.start(); - while (!(breaked || breaked_out)) { - try { - Thread.sleep(10); - } catch (Exception e) { - log.error("Thread error: " + e); - } - } - breaked = false; - } - } - }; - - class PlayThread extends Thread{ - byte tempBuffer[] = new byte[320]; - public void run(){ - try{ - sourceDataLine.flush(); - int len; - while ((len = audioInputStream.read(tempBuffer, 0, - tempBuffer.length)) != -1){ - if(breaked_out) break; - if(len > 0) sourceDataLine.write(tempBuffer, 0, len); - } - //breaked or stopped - sourceDataLine.flush(); - sourceDataLine.close(); - breaked = true; - }catch(Exception e){ - log.error("Thread error: " + e); - } - } - }; -} - diff --git a/Mage.Client/src/main/java/mage/client/util/audio/AudioGroup.java b/Mage.Client/src/main/java/mage/client/util/audio/AudioGroup.java new file mode 100644 index 00000000000..ae90e67515d --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/util/audio/AudioGroup.java @@ -0,0 +1,10 @@ +package mage.client.util.audio; + +/** + * + * @author LevelX2 + */ +public enum AudioGroup { + GameSounds, + OtherSounds; +} diff --git a/Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java b/Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java new file mode 100644 index 00000000000..da33d4be6d7 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java @@ -0,0 +1,256 @@ +package mage.client.util.audio; + +import java.io.File; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.DataLine; +import mage.client.constants.Constants; +import mage.client.dialog.PreferencesDialog; +import org.apache.log4j.Logger; + +/** + * Manager class for playing audio files. + * + * @author nantuko + */ +public class AudioManager { + + private static final Logger log = Logger.getLogger(AudioManager.class); + + private MageClip nextPageClip = null; + private MageClip prevPageClip = null; + private MageClip anotherTabClip = null; + private MageClip nextPhaseClip = null; + private MageClip endTurnClip = null; + private MageClip tapPermanentClip = null; + private MageClip summonClip = null; + private MageClip diedCreatureClip = null; + private MageClip drawClip = null; + private MageClip buttonOkClip = null; + private MageClip buttonCancelClip = null; + private MageClip attackClip = null; + private MageClip blockClip = null; + private MageClip addPermanentClip = null; + private MageClip addArtifactClip = null; + private MageClip updateStackClip = null; + private MageClip onHover = null; + + private MageClip playerJoinedTable = null; + private MageClip playerSubmittedDeck = null; + private MageClip playerWhispered = null; + private MageClip playerLeft = null; + private MageClip playerWon = null; + private MageClip playerLost = null; + /** + * AudioManager singleton. + */ + private static AudioManager audioManager = null; + + + public static AudioManager getManager() { + if (audioManager == null) { + audioManager = new AudioManager(); + audioManager.nextPageClip = + new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPrevPage.wav"), + AudioGroup.OtherSounds); //sounds better than OnNextPage + audioManager.prevPageClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPrevPage.wav"), + AudioGroup.OtherSounds); + audioManager.anotherTabClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnNextPage.wav"), + AudioGroup.OtherSounds); + + audioManager.playerSubmittedDeck = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerSubmittedDeck.wav"), + AudioGroup.OtherSounds); + audioManager.playerWhispered = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerWhispered.wav"), + AudioGroup.OtherSounds); + audioManager.playerLeft = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerLeft.wav"), + AudioGroup.OtherSounds); + + // in games sounds + audioManager.nextPhaseClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnNextPhase.wav"), + AudioGroup.GameSounds); + audioManager.endTurnClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnEndTurn.wav"), + AudioGroup.GameSounds); + audioManager.tapPermanentClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnTapPermanent.wav"), + AudioGroup.GameSounds); + audioManager.summonClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnSummon.wav"), + AudioGroup.GameSounds); + audioManager.diedCreatureClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnSummon-.wav"), + AudioGroup.GameSounds); + audioManager.drawClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnDraw.wav"), + AudioGroup.GameSounds); + audioManager.buttonOkClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnButtonOk.wav"), + AudioGroup.GameSounds); + audioManager.buttonCancelClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnButtonCancel.wav"), + AudioGroup.GameSounds); + audioManager.attackClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAttack.wav"), + AudioGroup.GameSounds); + audioManager.blockClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnBlock.wav"), + AudioGroup.GameSounds); + audioManager.addPermanentClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAddPermanent.wav"), + AudioGroup.GameSounds); + audioManager.addArtifactClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAddArtifact.wav"), + AudioGroup.GameSounds); + audioManager.updateStackClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnStackNew.wav"), + AudioGroup.GameSounds); + audioManager.onHover = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnHover.wav"), + AudioGroup.GameSounds); + audioManager.playerWon = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerWon.wav"), + AudioGroup.GameSounds); + audioManager.playerLost = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerLost.wav"), + AudioGroup.GameSounds); + } + return audioManager; + } + + public static void playNextPage() { + checkAndPlayClip(getManager().nextPageClip); + } + + public static void playPrevPage() { + checkAndPlayClip(getManager().prevPageClip); + } + + public static void playAnotherTab() { + checkAndPlayClip(getManager().anotherTabClip); + } + + public static void playNextPhase() { + checkAndPlayClip(getManager().nextPhaseClip); + } + + public static void playEndTurn() { + checkAndPlayClip(getManager().endTurnClip); + } + + public static void playTapPermanent() { + checkAndPlayClip(getManager().tapPermanentClip); + } + + public static void playSummon() { + checkAndPlayClip(getManager().summonClip); + } + + public static void playDiedCreature() { + checkAndPlayClip(getManager().diedCreatureClip); + } + + public static void playDraw() { + checkAndPlayClip(getManager().drawClip); + } + + public static void playButtonOk() { + checkAndPlayClip(getManager().buttonOkClip); + } + + public static void playButtonCancel() { + checkAndPlayClip(getManager().buttonCancelClip); + } + + public static void playAttack() { + checkAndPlayClip(getManager().attackClip); + } + + public static void playBlock() { + checkAndPlayClip(getManager().blockClip); + } + + public static void playAddPermanent() { + checkAndPlayClip(getManager().addPermanentClip); + } + + public static void playAddArtifact() { + checkAndPlayClip(getManager().addArtifactClip); + } + + public static void playStackNew() { + checkAndPlayClip(getManager().updateStackClip); + } + + public static void playOnHover() { + checkAndPlayClip(getManager().onHover); + } + + public static void playPlayerJoinedTable() { + if (audioManager.playerJoinedTable == null) { + audioManager.playerJoinedTable = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerJoinedTable.wav"), + AudioGroup.OtherSounds); + } + checkAndPlayClip(getManager().playerJoinedTable); + } + + public static void playPlayerWhispered() { + checkAndPlayClip(getManager().playerWhispered); + } + + public static void playPlayerSubmittedDeck() { + checkAndPlayClip(getManager().playerSubmittedDeck); + } + + public static void playPlayerLeft() { + checkAndPlayClip(getManager().playerLeft); + } + + public static void playPlayerLost() { + checkAndPlayClip(getManager().playerLost); + } + + public static void playPlayerWon() { + checkAndPlayClip(getManager().playerWon); + } + + private static void checkAndPlayClip(MageClip mageClip) { + try { + if (mageClip != null) { + boolean playSound = false; + switch (mageClip.getAudioGroup()) { + case GameSounds: + playSound = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_GAME_ON, "true").equals("true"); + break; + case OtherSounds: + playSound = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_OTHER_ON, "true").equals("true"); + } + + if (playSound) { + audioManager.play(mageClip.getClip()); + } + } + } catch (Exception e) { + Logger.getLogger(AudioManager.class).fatal("Error while playing sound clip.", e); + } + } + + public void play(final Clip clip) { + new Thread(new Runnable() { + public void run() { + clip.setFramePosition(0); + clip.start(); + } + }).run(); + } + + private Clip loadClip(String filename) { + try { + File soundFile = new File(filename); + AudioInputStream soundIn = AudioSystem + .getAudioInputStream(soundFile); + AudioFormat format = new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, AudioSystem.NOT_SPECIFIED, + 16, 2, 4, AudioSystem.NOT_SPECIFIED, true); + DataLine.Info info = new DataLine.Info(Clip.class, format); + + Clip clip = (Clip) AudioSystem.getLine(info); + clip.open(soundIn); + + return clip; + } catch (Exception e) { + //e.printStackTrace(); + log.error("Couldn't load sound: " + filename + "."); + } + + return null; + } + + +} diff --git a/Mage.Client/src/main/java/mage/client/util/audio/MageClip.java b/Mage.Client/src/main/java/mage/client/util/audio/MageClip.java new file mode 100644 index 00000000000..efa0ed2492b --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/util/audio/MageClip.java @@ -0,0 +1,55 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this list +* of conditions and the following disclaimer in the documentation and/or other materials +* provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* The views and conclusions contained in the software and documentation are those of the +* authors and should not be interpreted as representing official policies, either expressed +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.client.util.audio; + +import javax.sound.sampled.Clip; + +/** + * + * @author LevelX2 + */ +public class MageClip { + + private final Clip clip; + private final AudioGroup audioGroup; + + public MageClip(Clip clip, AudioGroup audioGroup) { + this.clip = clip; + this.audioGroup = audioGroup; + } + + public Clip getClip() { + return clip; + } + + public AudioGroup getAudioGroup() { + return audioGroup; + } + +} diff --git a/Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java b/Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java new file mode 100644 index 00000000000..ed03821d8df --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java @@ -0,0 +1,169 @@ +package mage.client.util.audio; + +import java.io.File; +import java.awt.List; +import javax.sound.sampled.*; +import mage.client.constants.Constants; +import mage.client.dialog.PreferencesDialog; +import org.apache.log4j.Logger; + +/** + * + * @author renli + */ +public class MusicPlayer { + + private static final Logger log = Logger.getLogger(AudioManager.class); + String filepath; + String filename; + List filelist = new List(); + static MusicPlayer player = null; + + //open file and add list + private boolean open() { + String path = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_MATCH_MUSIC_PATH, "true"); + filepath = path + File.separator; + if (path == null) { + filepath = Constants.BASE_MUSICS_PATH; + } + filelist.removeAll(); + File filedir = new File(filepath); + File[] fileread = filedir.listFiles(); + if (fileread == null) { + return false; + } + if (fileread.length == 0) { + return false; + } + String filename; + for (File f : fileread) { + filename = f.getName().toLowerCase(); + if (filename.endsWith(".mp3") || filename.endsWith(".wav")) { + filelist.add(filename); + } + } + if (filelist.getItemCount() == 0) { + return false; + } + return true; + } + + public static void playBGM() { + stopBGM(); + if (player == null) { + player = new MusicPlayer(); + } + if (player.open()) { + player.play(); + } + } + + public void play() { + String soundsOn = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_MATCH_MUSIC_ON, "true"); + if (soundsOn.equals("true")) { + player.breaked = false; + player.breaked_out = false; + player.stopped = false; + Thread player = new Thread(new playerThread()); + player.start(); + } + } + + public static void stopBGM() { + if (player != null) { + player.stopped = true; + player.breaked_out = true; + player.breaked = true; + try { + Thread.sleep(100); + } catch (Exception e) { + log.error("Thread error: " + e); + } + } + } + + public volatile boolean breaked = false; + public volatile boolean breaked_out = false; + public volatile boolean stopped = false; + public volatile FloatControl volume; + AudioInputStream audioInputStream; + AudioFormat audioFormat; + SourceDataLine sourceDataLine; + + class playerThread extends Thread { + + private void load(File file) { + try { + audioInputStream = AudioSystem.getAudioInputStream(file); + audioFormat = audioInputStream.getFormat(); + // mp3 decode + if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) { + audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, + audioFormat.getSampleRate(), 16, audioFormat.getChannels(), audioFormat.getChannels() * 2, + audioFormat.getSampleRate(), false); + audioInputStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream); + } + //output + DataLine.Info dataLineInfo = new DataLine.Info( + SourceDataLine.class, audioFormat, + AudioSystem.NOT_SPECIFIED); + sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); + sourceDataLine.open(audioFormat); + volume = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN); + sourceDataLine.start(); + } catch (Exception e) { + log.error("Couldn't load file: " + file + " " + e); + } + + } + + public void run() { + try { + Thread.sleep(100); + } catch (Exception e) { + } + while (!stopped) { + int it = (int) Math.abs(Math.random() * (filelist.getItemCount())); + File file = new File(filepath + filelist.getItem(it)); + load(file); + Thread PlayThread = new Thread(new PlayThread()); + PlayThread.start(); + while (!(breaked || breaked_out)) { + try { + Thread.sleep(10); + } catch (Exception e) { + log.error("Thread error: " + e); + } + } + breaked = false; + } + } + }; + + class PlayThread extends Thread { + + byte tempBuffer[] = new byte[320]; + + public void run() { + try { + sourceDataLine.flush(); + int len; + while ((len = audioInputStream.read(tempBuffer, 0, + tempBuffer.length)) != -1) { + if (breaked_out) { + break; + } + if (len > 0) { + sourceDataLine.write(tempBuffer, 0, len); + } + } + //breaked or stopped + sourceDataLine.flush(); + sourceDataLine.close(); + breaked = true; + } catch (Exception e) { + log.error("Thread error: " + e); + } + } + }; +} diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java index 38f955a5f96..21cae8b95d8 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java @@ -30,7 +30,7 @@ import mage.cards.MagePermanent; import mage.cards.TextPopup; import mage.cards.action.ActionCallback; import mage.cards.action.TransferData; -import mage.client.util.AudioManager; +import mage.client.util.audio.AudioManager; import mage.components.ImagePanel; import mage.constants.CardType; import mage.utils.CardUtil; diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 5f96d093920..974a74328b6 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -2140,5 +2140,5 @@ public abstract class PlayerImpl> implements Player, Ser return game.isOpponent(this, playerToCheckId); } - + }