BdR Posted June 13, 2018 Share Posted June 13, 2018 I'm a bit confused about loading and playing sound effects. My game is setup in different states, first the Preloader state makes sure all images and sounds are loaded. The GameState is the main game, this state is re-started for each next level. There are different levels but the state is the same, it just changes a _levelIndex variable and uses the same state. The GameState adds the needed audio to the game in the .create() function, and this create() function is called every time the GameState is started. See code below mygame.Preloader.prototype = { preload: function(){ this.loadingbar_bg = this.add.sprite(80, 512, "loadingbar_bg"); this.loadingbar_fill = this.add.sprite(80, 512, "loadingbar_fill"); this.load.setPreloadSprite(this.loadingbar_fill); // load sounds this.load.audio("button", ["snd/button.mp3", "snd/button.ogg"]); this.load.audio("punch", ["snd/punch.mp3", "snd/punch.ogg"]); this.load.audio("coin", ["snd/coin.mp3", "snd/coin.ogg"]); }, create: function() { this.state.start("MainGame"); }, }; mygame.GameState.prototype = { create: function() { this.stage.backgroundColor = "#f0f"; // etc. // sound effects this.sound1 = this.game.add.audio("button"); this.sound2 = this.game.add.audio("punch"); this.sound3 = this.game.add.audio("coin"); //etc. }, update: function() { if (hitFace) this.sound2.play(); }, doNextLevel: function() { this.sound1.play(); this._levelIndex++; // next level this.state.start("MainGame"); // restart this state }, //etc. }; The problem is that when I play the punch sound a couple of times in a row, the console gives this warning: Phaser.Sound: Audio source already exists which Phaser raises in code here. This warning appears even when the GameState is started for the first time. So my questions are: 1) What does this message "Audio source already exists" mean ? Or should I ignore it? 2) if I want to use a sound in a state, do I have to re-add it every time the state is started and .create() is called ? 3) also somewhat related, if I want to use the same sound sample in multiple different States (menu, game, options etc.) do I have to game.add.audio() it for each state? Link to comment Share on other sites More sharing options...
GideonSam Posted June 14, 2018 Share Posted June 14, 2018 May be becuase of the auido played in the update loop if (hitFace){ this.sound2.play(); hitFace = false } Link to comment Share on other sites More sharing options...
BdR Posted June 14, 2018 Author Share Posted June 14, 2018 Thanks, but no that is not it. It's just an example code snippet. The actual code in my game is correctly calling it just once. There is always a few seconds between playing the sound effect again, and by then the previous sample playback is already finished. But still the "Phaser.Sound: Audio source already exists" warning appears. Link to comment Share on other sites More sharing options...
BdR Posted June 15, 2018 Author Share Posted June 15, 2018 I've made a sandbox with the StateManager restarting a State and using samples -> http://phaser.io/sandbox/lARYwwpN However the sandbox is running Phaser 2.6.2 so I couldn't reproduce the warning "Audio source already exists" because that warning is not in the 2.6.2 release. Anyway, I use mp3 and ogg samples for the sound effects and I suspect it has to do with decoding the sounds. My question is: do I have to decode the sound samples every time the player starts (or restarts) a level i.e. restart the GameState? In other words, if the GameState will be .create() each time a level is (re)started, will the decoded samples be destroyed and have to be reloaded each time? That seems wasteful, what is the best way to do this? Link to comment Share on other sites More sharing options...
onlycape Posted June 15, 2018 Share Posted June 15, 2018 4 hours ago, BdR said: My question is: do I have to decode the sound samples every time the player starts (or restarts) a level i.e. restart the GameState? In other words, if the GameState will be .create() each time a level is (re)started, will the decoded samples be destroyed and have to be reloaded each time? That seems wasteful, what is the best way to do this? @BdR , No. If you load sound assets in a state with the option "autodecode" (example: this.game.load.audio('blaster', 'audio/SoundEffects/blaster.mp3', true)), then the decoded sounds will be stored in cache and available for other states. You can use a state to load the common assets only one time (like in the typical loading screen with progress bar). Regards. Link to comment Share on other sites More sharing options...
BdR Posted June 15, 2018 Author Share Posted June 15, 2018 @onlycape The autoDecode is optional and defaults to true, so that is already the situation in my first post. I guess my quesion boils down to this: If my game state is like so: mygame.GameState.prototype = { create: function() { // add sound effects this.sound1 = this.game.add.audio("button"); //etc. }, What happens when I do game.add.audio("button") in the .create() method? Specifically what will happen when the State is restarted like 50 times or more? Will Phaser load & reserve memory etc. 50 times for the same sample? Will this impact overall performance? Link to comment Share on other sites More sharing options...
samme Posted June 15, 2018 Share Posted June 15, 2018 On 6/13/2018 at 3:54 PM, BdR said: What does this message "Audio source already exists" mean ? Or should I ignore it? It looks like this warning is spurious in this case, sorry about that. Link to comment Share on other sites More sharing options...
samme Posted June 15, 2018 Share Posted June 15, 2018 You need to use add.sound() only once per sound per game. The sounds aren't removed from the manager when you change or restart states. Use game.debug.sound() to see how many are held in the manager. BdR 1 Link to comment Share on other sites More sharing options...
Recommended Posts