mirror of
https://github.com/photonstorm/phaser
synced 2024-12-25 12:33:38 +00:00
120 lines
2.6 KiB
TypeScript
120 lines
2.6 KiB
TypeScript
|
/// <reference path="../Game.ts" />
|
||
|
/// <reference path="../SoundManager.ts" />
|
||
|
|
||
|
/**
|
||
|
* Phaser - Sound
|
||
|
*
|
||
|
* A Sound file, used by the Game.SoundManager for playback.
|
||
|
*/
|
||
|
|
||
|
module Phaser {
|
||
|
|
||
|
export class Sound {
|
||
|
|
||
|
constructor(context, gainNode, data, volume?: number = 1, loop?: bool = false) {
|
||
|
|
||
|
this._context = context;
|
||
|
this._gainNode = gainNode;
|
||
|
this._buffer = data;
|
||
|
this._volume = volume;
|
||
|
this.loop = loop;
|
||
|
|
||
|
// Local volume control
|
||
|
if (this._context !== null)
|
||
|
{
|
||
|
this._localGainNode = this._context.createGainNode();
|
||
|
this._localGainNode.connect(this._gainNode);
|
||
|
this._localGainNode.gain.value = this._volume;
|
||
|
}
|
||
|
|
||
|
if (this._buffer === null)
|
||
|
{
|
||
|
this.isDecoding = true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.play();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
private _context;
|
||
|
private _gainNode;
|
||
|
private _localGainNode;
|
||
|
private _buffer;
|
||
|
private _volume: number;
|
||
|
private _sound;
|
||
|
|
||
|
loop: bool = false;
|
||
|
duration: number;
|
||
|
isPlaying: bool = false;
|
||
|
isDecoding: bool = false;
|
||
|
|
||
|
public setDecodedBuffer(data) {
|
||
|
|
||
|
this._buffer = data;
|
||
|
this.isDecoding = false;
|
||
|
this.play();
|
||
|
|
||
|
}
|
||
|
|
||
|
public play() {
|
||
|
|
||
|
if (this._buffer === null || this.isDecoding === true)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this._sound = this._context.createBufferSource();
|
||
|
this._sound.buffer = this._buffer;
|
||
|
this._sound.connect(this._localGainNode);
|
||
|
|
||
|
if (this.loop)
|
||
|
{
|
||
|
this._sound.loop = true;
|
||
|
}
|
||
|
|
||
|
this._sound.noteOn(0); // the zero is vitally important, crashes iOS6 without it
|
||
|
|
||
|
this.duration = this._sound.buffer.duration;
|
||
|
this.isPlaying = true;
|
||
|
|
||
|
}
|
||
|
|
||
|
public stop() {
|
||
|
|
||
|
if (this.isPlaying === true)
|
||
|
{
|
||
|
this.isPlaying = false;
|
||
|
|
||
|
this._sound.noteOff(0);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
public mute() {
|
||
|
|
||
|
this._localGainNode.gain.value = 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
public unmute() {
|
||
|
|
||
|
this._localGainNode.gain.value = this._volume;
|
||
|
|
||
|
}
|
||
|
|
||
|
public set volume(value: number) {
|
||
|
|
||
|
this._volume = value;
|
||
|
this._localGainNode.gain.value = this._volume;
|
||
|
|
||
|
}
|
||
|
|
||
|
public get volume(): number {
|
||
|
return this._volume;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|