X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;ds=sidebyside;f=0.6.x%2Fjs%2F07_audio%2F00_XAudio.js;h=60bc56e5929ea90716df048815592944988f9c22;hb=HEAD;hp=33faebfd120242f08991eaf416177b79ca589bd3;hpb=a3d03e96ad8c0392ef683eb6c64421e094b96958;p=pettanr%2FclientJs.git
diff --git a/0.6.x/js/07_audio/00_XAudio.js b/0.6.x/js/07_audio/00_XAudio.js
index 33faebf..60bc56e 100644
--- a/0.6.x/js/07_audio/00_XAudio.js
+++ b/0.6.x/js/07_audio/00_XAudio.js
@@ -25,29 +25,36 @@ X_TEMP.onSystemReady.push(
});
/**
- *
è¤æ°ã®ããã¯ã¨ã³ããããä¸ããããé³å£°ãåçå¯è½ãªãã®ãè¦ã¤ããé³å£°ãåçãã¾ãã
+ *
è¤æ°ã®ãªã¼ãã£ãªã»ããã¯ã¨ã³ããããä¸ããããé³å£°ãåçå¯è½ãªãã®ãè¦ã¤ããé³å£°ãåçãã¾ãã
*
HTMLAudio ã®åä½ã»æ©è½ããã©ã¦ã¶æ¯ã«ãã©ãã©ãªã®ã«æ¥ãç
®ãããã¡ã½ãããã¤ãã³ãã¯ç¬èªã«å®ç¾©ãã¦ãã¾ãã
*
ããã¯ã¨ã³ãã®ç¨®é¡
- * HTMLAudio, WebAudio, Silverlight
+ *
HTMLAudio, WebAudio, Silverlight, WMP
*
ã¤ãã³ã
*
- * - X.Event.BACKEND_READY
- é³å£°(src ãªã¹ã)ãåçå¯è½ãªããã¯ã¨ã³ããè¦ã¤ãã£ãã
- *
- X.Event.BACKEND_NONE
- é³å£°ãåçå¯è½ãªããã¯ã¨ã³ããè¦ã¤ãããªãã£ãã
- *
- X.Event.READY
- åçå¯è½ãå®éã®ç¶æ
㯠canplay ãã loadeddata ã¾ã§æ§ã
ããã
- *
- X.Event.ERROR
+ * - X.Event.BACKEND_READY
- é³å£°(src ãªã¹ã)ãåçå¯è½ãªããã¯ã¨ã³ããè¦ã¤ãã£ãã
+ *
- X.Event.BACKEND_NONE
- é³å£°ãåçå¯è½ãªããã¯ã¨ã³ããè¦ã¤ãããªãã£ããAudio 㯠kill ããã¾ãã
+ *
- X.Event.MEDIA_CAN_TOUCH
- ã¢ãã¤ã«ç«¯æ«ã®å¶ç´ã§é³å£°ã®åçã¾ãã¯ãã¼ãã«ãã¿ãããå¿
è¦ã¨ããå ´åãã¿ããã¤ãã³ãå
㧠play ãå¼ã³åºãæºåãåºæ¥ããã¨ãéç¥ããã
+ *
- X.Event.READY
- åçå¯è½ãå®éã®ç¶æ
㯠canplay ãã loadeddata ã¾ã§æ§ã
ãããã¢ãã¤ã«ç«¯æ«ã®å ´åãã¿ãããã¦åçãéå§ãããå ´åã«
+ *
- X.Event.ERROR
* - 1 : ã¦ã¼ã¶ã¼ã«ãã£ã¦ã¡ãã£ã¢ã®åå¾ãä¸æããã
*
- 2 : ãããã¯ã¼ã¯ã¨ã©ã¼
*
- 3 : ã¡ãã£ã¢ã®ãã³ã¼ãã¨ã©ã¼
*
- 4 : ã¡ãã£ã¢ããµãã¼ãããã¦ããªã
*
- * - X.Event.MEDIA_PLAYING
- åçä¸ã«1ç§ä»¥ä¸ã®ã¿ã¤ãã³ã°ã§çºçï¼currentTime ãåãã?
- *
- X.Event.MEDIA_LOOP
- ã«ã¼ãç´åã«çºçãキャï¾ï½¾ï¾å¯è½
- *
- X.Event.MEDIA_LOOPED
- ã«ã¼ãæã«çºç
- *
- X.Event.MEDIA_ENDED
- åçä½ç½®ã®(é³å£°ã®)æå¾ã«ã¤ãã
- *
- X.Event.MEDIA_PAUSED
- ãã¼ãºãã
- *
- X.Event.MEDIA_WAITING
- åçä¸ã«é³å£°ãå¾
æ©ç¶æ
ã«ã
- *
- X.Event.MEDIA_SEEKING
- ã·ã¼ã¯ä¸ã«é³å£°ãå¾
æ©ç¶æ
ã«ã
+ *
- X.Event.MEDIA_PLAYING
- åçä¸ã«1ç§ä»¥ä¸ã®ã¿ã¤ãã³ã°ã§çºçï¼currentTime ãåãã?
+ *
- X.Event.MEDIA_LOOP
- ã«ã¼ãç´åã«çºçãキャï¾ï½¾ï¾å¯è½
+ *
- X.Event.MEDIA_LOOPED
- ã«ã¼ãæã«çºç
+ *
- X.Event.MEDIA_ENDED
- åçä½ç½®ã®(é³å£°ã®)æå¾ã«ã¤ãã
+ *
- X.Event.MEDIA_PAUSED
- ãã¼ãºãã
+ *
- X.Event.MEDIA_WAITING
- åçä¸ã«é³å£°ãå¾
æ©ç¶æ
ã«ã
+ *
- X.Event.MEDIA_SEEKING
- ã·ã¼ã¯ä¸ã«é³å£°ãå¾
æ©ç¶æ
ã«ã
*
+ * ã½ã¼ã¹ãªã¹ãã«ä¸ãã url æåå
+ * ããã·ã¥ãã©ã°ã¡ã³ã以ä¸ã«ãã¼ã¿ãæ¸ããã¨ã§ãåãªã¼ãã£ãªããã¯ã¨ã³ããåçå¯è½æ§ã®å¤æã«ããã£ã¦åèã«ãããã¼ã¿ã渡ããã¨ãã§ãã¾ãã
+ *
+ * - CBR=1
- audio ãåºå®ãããã¬ã¼ãã§ãããã¨ã示ããAndroid ç¨ Opera12- ã¯å¯å¤ãããã¬ã¼ãã® mp3 ãæ£ããã·ã¼ã¯ã§ããªãã
+ * [ 'snd.mp3', 'snd.mp3#CBR=1' ] ã¨æå®ããã¨ãAndroid ç¨ Opera12- ã§ã¯ CBR 㪠mp3 ããä»ã®ç°å¢ã§ã¯ãããã¡ã¤ã«ãµã¤ãºã®å°ãã VBR 㪠mp3 ã使ç¨ãããã(æªå®è£
)
+ *
- ext=mp3
- ãã¹ã«æ¡å¼µåãå«ã¾ããªãå ´åãã¾ãã¯ä¸æ¸ãæå®ãããå ´åã«æå®ãã
*
* @alias X.Audio
* @class å種ãªã¼ãã£ãªæ©è½ãã©ãããã¤ã³ã¿ã¼ãã§ã¤ã¹ãå
±éåããã
@@ -56,12 +63,11 @@ X_TEMP.onSystemReady.push(
* @param {array|string} sourceList
* @param {object=} opt_option
* @example //
- * var audio = X.Audio( [ 'etc/special.mp3', 'etc/special.ogg', 'etc/special.wav' ] )
- .listenOnce( X.Event.READY, onReady );
+ * var audio = X.Audio( [ 'etc/special.mp3', 'etc/special.ogg', 'etc/special.wav' ] ).listenOnce( X.Event.READY, onReady );
*/
X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
'X.Audio',
- X_Class.POOL_OBJECT,
+ X_Class.NONE,
{
/**
* é³å£°ã® urlãX.Event.BACKEND_READY ã§è¨å®ãããã
@@ -69,24 +75,32 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
* @type {string}
*/
'source' : '',
+
/**
* é³å£°åçããã¯ã¨ã³ãã®ååãX.Event.BACKEND_READY ã§è¨å®ãããã
* @alias Audio.prototype.backendName
* @type {string}
*/
'backendName' : '',
-
+
'Constructor' : function( sourceList, opt_option ){
X_Audio_startDetectionBackend(
X_Audio_BACKENDS[ 0 ], this,
X_Type_isArray( sourceList ) ? X_Array_copy( sourceList ) : [ sourceList ],
opt_option || {} );
this[ 'listenOnce' ]( [ X_EVENT_BACKEND_READY, X_EVENT_BACKEND_NONE, X_EVENT_KILL_INSTANCE ], X_Audio_handleEvent );
+ X_ViewPort[ 'listenOnce' ]( X_EVENT_UNLOAD, this, X_Audio_handleEvent );
},
/**
* åçãéå§ä½ç½®ã»çµäºä½ç½®ãã«ã¼ãã®æç¡ãã«ã¼ã以éã®éå§ä½ç½®ãã«ã¼ã以éã®çµäºä½ç½®
* @alias Audio.prototype.play
+ * @param {number=} startTime éå§æéã ms ã§
+ * @param {number=} endTime çµäºæéã ms ã§
+ * @param {boolean=} loop endTimeã«éããéã«æ²ãã«ã¼ããããã
+ * @param {number=} loopStartTime ã«ã¼ã以å¾ã®éå§æéã ms ã§
+ * @param {number=} loopEndTime ã«ã¼ã以å¾ã®çµäºæéã ms ã§
+ * @return {Audio} ã¡ã½ãããã§ã¼ã³
*/
'play' : function( startTime, endTime, loop, loopStartTime, loopEndTime ){
var pair = X_Pair_get( this );
@@ -94,8 +108,10 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
return this;
},
/**
- * ã·ã¼ã¯
+ * ã·ã¼ã¯ãåçä¸ã§ç¡ãå ´åã¯æ¬¡ååçéå§ä½ç½®ã®æå®ã®ã¿
* @alias Audio.prototype.seek
+ * @param {number} seekTime ã·ã¼ã¯ä½ç½®ã ms ã§
+ * @return {Audio} ã¡ã½ãããã§ã¼ã³
*/
'seek' : function( seekTime ){
var pair = X_Pair_get( this );
@@ -105,6 +121,7 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
/**
* ãã¼ãº
* @alias Audio.prototype.pause
+ * @return {Audio} ã¡ã½ãããã§ã¼ã³
*/
'pause' : function(){
var pair = X_Pair_get( this );
@@ -114,6 +131,21 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
/**
* ç¶æ
㮠getter 㨠setter
* @alias Audio.prototype.state
+ * @param {object=} obj setter ã®å ´åãä¸æ¸ãããå¤ãæ ¼ç´ããobject
+ * @return {Audio|object}
+ * @example
+audio.setState(
+ {
+ 'startTime' : 0,
+ 'endTime' : 80000,
+ 'loopStartTime' : 120000,
+ 'loopEndTime' : 200000,
+ 'currentTime' : 0,
+ 'loop' : true,
+ 'looded' : false,
+ 'volume' : 1,
+ 'autoplay' : true
+});
*/
'state' : function( obj ){
var pair = X_Pair_get( this );
@@ -127,18 +159,22 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
'currentTime' : -1,
'loop' : false,
'looded' : false,
- 'error' : false,
+ 'error' : 0,
+ 'autoplay' : false,
'playing' : false,
- 'source' : this[ 'source' ] || '',
- 'duration' : 0
+ 'source' : this[ 'source' ],
+ 'duration' : 0,
+ 'volume' : 0.5
};
};
pair && pair.setState( obj );
return this;
},
/**
- * ã«ã¼ãã® getter 㨠setter
+ * ã«ã¼ãã® setter
* @alias Audio.prototype.loop
+ * @param {boolean} v
+ * @return {Audio}
*/
'loop' : function( v ){
var pair = X_Pair_get( this );
@@ -146,8 +182,10 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
return this;
},
/**
- * ããªã¥ã¼ã ã® getter 㨠setter å®è£
ä¸ååï¼
+ * ããªã¥ã¼ã ã® setter å®è£
ä¸ååï¼
* @alias Audio.prototype.volume
+ * @param {number} v 0ï½1
+ * @return {Audio}
*/
'volume' : function( v ){
var pair = X_Pair_get( this );
@@ -155,8 +193,10 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
return this;
},
/**
- * åçä½ç½®ã
+ * åçä½ç½®ã®setterã
* @alias Audio.prototype.currentTime
+ * @param {number} v msã§
+ * @return {Audio}
*/
'currentTime' : function( v ){
var pair = X_Pair_get( this );
@@ -166,6 +206,7 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
/**
* åçä¸ãï¼
* @alias Audio.prototype.isPlaying
+ * @return {boolean}
*/
'isPlaying' : function(){
var pair = X_Pair_get( this );
@@ -176,7 +217,7 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
);
function X_Audio_handleEvent( e ){
- var backend;
+ var backend, src, pair;
switch( e.type ){
case X_EVENT_BACKEND_READY :
@@ -185,17 +226,28 @@ function X_Audio_handleEvent( e ){
this[ 'unlisten' ]( X_EVENT_BACKEND_NONE, X_Audio_handleEvent );
this[ 'source' ] = e[ 'source' ];
this[ 'backendName' ] = backend.backendName;
+
X_Pair_create( this, backend.klass( this, e[ 'source' ], e[ 'option' ] ) );
+ this[ 'listenOnce' ]( X_EVENT_READY, X_Audio_handleEvent );
+ break;
+
+ case X_EVENT_READY : // TODO AudioBase å´ã¸è¡ããªã?
+ pair = X_Pair_get( this );
+ ( pair.autoplay || pair._playReserved ) && pair.actualPlay();
+ delete pair._playReserved;
break;
case X_EVENT_BACKEND_NONE :
+ case X_EVENT_UNLOAD :
this[ 'kill' ]();
break;
case X_EVENT_KILL_INSTANCE :
- backend = X_Pair_get( this );
- backend && backend[ 'kill' ]();
- X_Pair_release( this, backend );
+ X_ViewPort[ 'unlisten' ]( X_EVENT_UNLOAD, this, X_Audio_handleEvent );
+ if( backend = X_Pair_get( this ) ){
+ backend[ 'kill' ]();
+ X_Pair_release( this, backend );
+ };
break;
};
};
@@ -206,8 +258,9 @@ function X_Audio_handleEvent( e ){
*/
function X_Audio_startDetectionBackend( backend, xaudio, sourceList, option ){
- var source = sourceList[ 0 ] || '',
- ext = X_URL_getEXT( source ),
+ var source = sourceList[ 0 ] || '',
+ hash = X_URL_paramToObj( X_URL_getHash( source ) ),
+ ext = hash[ 'ext' ] || X_URL_getEXT( source ),
sup;
if( source && backend ){
@@ -215,29 +268,36 @@ function X_Audio_startDetectionBackend( backend, xaudio, sourceList, option ){
sup[ 5 ] = sup;
xaudio[ 'listenOnce' ]( X_EVENT_COMPLETE, backend, X_Audio_onEndedDetection, sup );
- backend.detect( xaudio, source, ext );
+ backend.detect( xaudio, ext, hash );
} else {
xaudio[ 'asyncDispatch' ]( X_EVENT_BACKEND_NONE );
};
};
function X_Audio_onEndedDetection( e, xaudio, sourceList, option, source, ext, sup ){
- var i = X_Audio_BACKENDS.indexOf( this ), backend;
+ var i = X_Audio_BACKENDS.indexOf( this ), _e, hash, backend;
if( e.canPlay ){
- xaudio[ 'asyncDispatch' ]( {
+ _e = {
type : X_EVENT_BACKEND_READY,
'option' : option,
'source' : source,
- 'backendName' : this[ 'backendName' ],
+ 'backendName' : this.backendName,
'backendID' : i
- } );
+ };
+ // WebAudio
+ if( this.backendID === 1 ) _e[ 'needTouchForPlay' ] = /* X_WebAudio_need1stTouch && */ X_WebAudio_isNoTouch;
+ // HTMLAudio
+ if( this.backendID === 2 ) _e[ 'needTouchForLoad' ] = X_HTMLAudio_need1stTouch;
+
+ xaudio[ 'asyncDispatch' ]( _e );
} else {
- console.log( 'No ' + source + ' ' + this[ 'backendName' ] );
+ console.log( 'No ' + source + ' ' + this.backendName );
if( sup[ 3 ] = source = sourceList[ sourceList.indexOf( source ) + 1 ] ){
- sup[ 4 ] = ext = X_URL_getEXT( source );
+ hash = X_URL_paramToObj( X_URL_getHash( source ) );
+ sup[ 4 ] = ext = hash[ 'ext' ] || X_URL_getEXT( source );
xaudio[ 'listenOnce' ]( X_EVENT_COMPLETE, this, X_Audio_onEndedDetection, sup );
- this.detect( xaudio, source, ext );
+ this.detect( xaudio, ext, hash );
} else
if( backend = X_Audio_BACKENDS[ i + 1 ] ){
X_Audio_startDetectionBackend( backend, xaudio, sourceList, option );
@@ -253,11 +313,10 @@ var X_AudioBase = X_EventDispatcher[ 'inherits' ](
'X.AudioBase',
X_Class.ABSTRACT,
{
- url : '', //
- target : null, //
+ dispatcher : null,
- startTime : 0, //
- endTime : -1, //
+ startTime : 0, // state_startTime
+ endTime : -1, // state_startTime
loopStartTime : -1,
loopEndTime : -1,
seekTime : -1,
@@ -270,6 +329,8 @@ var X_AudioBase = X_EventDispatcher[ 'inherits' ](
autoplay : false,//
gain : 0.5,
+ _playReserved : false,
+
play : function( startTime, endTime, loop, loopStartTime, loopEndTime ){
if( 0 <= startTime ){
this.setState( {
@@ -293,6 +354,7 @@ var X_AudioBase = X_EventDispatcher[ 'inherits' ](
},
pause : function(){
+ this.seekTime = this.getActualCurrentTime();
this.playing && this.actualPause();
// delete this.autoplay
// delete this.playing
@@ -331,6 +393,7 @@ var X_AudioBase = X_EventDispatcher[ 'inherits' ](
'volume' : this.gain,
'playing' : this.playing,
'duration' : this.duration,
+ 'autoplay' : this.autoplay,
'currentTime' : this.playing ? this.getActualCurrentTime() : this.seekTime,
'error' : this.getActualError ? this.getActualError() : this.error
@@ -345,7 +408,7 @@ var X_AudioBase = X_EventDispatcher[ 'inherits' ](
for( k in obj ){
v = obj[ k ];
switch( k ){
- case 'currentTime' :
+ case 'currentTime' :
v = X_Audio_timeStringToNumber( v );
if( X_Type_isNumber( v ) ){
if( playing ){
@@ -441,7 +504,7 @@ var X_AudioBase = X_EventDispatcher[ 'inherits' ](
case 'useVideo' :
break;
default :
- throw ( 'bad arg! ' + k );
+ alert( 'bad arg! ' + k );
};
};
@@ -464,11 +527,12 @@ var X_AudioBase = X_EventDispatcher[ 'inherits' ](
function X_Audio_timeStringToNumber( time ){
var ary, ms, s = 0, m = 0, h = 0;
+
if( X_Type_isNumber( time ) ) return time;
if( !X_Type_isString( time ) || !time.length ) return;
ary = time.split( '.' );
- ms = parseInt( ( ary[ 1 ] + '000' ).substr( 0, 3 ) ) || 0;
+ ms = parseFloat( ( ary[ 1 ] + '000' ).substr( 0, 3 ) ) || 0;
ary = ary[ 0 ].split( ':' );
if( 3 < ary.length ) return;
@@ -477,17 +541,17 @@ function X_Audio_timeStringToNumber( time ){
case 0 :
break;
case 1 :
- s = parseInt( ary[ 0 ] ) || 0;
+ s = parseFloat( ary[ 0 ] ) || 0;
break;
case 2 :
- m = parseInt( ary[ 0 ] ) || 0;
- s = parseInt( ary[ 1 ] ) || 0;
+ m = parseFloat( ary[ 0 ] ) || 0;
+ s = parseFloat( ary[ 1 ] ) || 0;
if( 60 <= s ) alert( 'invalid time string ' + time );
break;
case 3 :
- h = parseInt( ary[ 0 ] ) || 0;
- m = parseInt( ary[ 1 ] ) || 0;
- s = parseInt( ary[ 2 ] ) || 0;
+ h = parseFloat( ary[ 0 ] ) || 0;
+ m = parseFloat( ary[ 1 ] ) || 0;
+ s = parseFloat( ary[ 2 ] ) || 0;
if( 60 <= s ) alert( 'invalid time string ' + time );
if( 60 <= m ) alert( 'invalid time string ' + time );
break;
@@ -498,34 +562,34 @@ function X_Audio_timeStringToNumber( time ){
return ms < 0 ? 0 : ms;
};
-function X_Audio_getStartTime( audioWrapper, endTime, delSeekTime ){
- var seek = audioWrapper.seekTime;
+function X_Audio_getStartTime( audioBase, endTime, delSeekTime ){
+ var seek = audioBase.seekTime;
- if( delSeekTime ) delete audioWrapper.seekTime;
+ if( delSeekTime ) delete audioBase.seekTime;
if( 0 <= seek ){
- if( audioWrapper.duration <= seek || endTime < seek ) return 0;
+ if( audioBase.duration <= seek || endTime < seek ) return 0;
return seek;
};
- if( audioWrapper.looped && 0 <= audioWrapper.loopStartTime ){
- if( audioWrapper.duration <= audioWrapper.loopStartTime || endTime < audioWrapper.loopStartTime ) return 0;
- return audioWrapper.loopStartTime;
+ if( audioBase.looped && 0 <= audioBase.loopStartTime ){
+ if( audioBase.duration <= audioBase.loopStartTime || endTime < audioBase.loopStartTime ) return 0;
+ return audioBase.loopStartTime;
};
- if( audioWrapper.startTime < 0 || audioWrapper.duration <= audioWrapper.startTime ) return 0;
- return audioWrapper.startTime;
+ if( audioBase.startTime < 0 || audioBase.duration <= audioBase.startTime ) return 0;
+ return audioBase.startTime;
};
-function X_Audio_getEndTime( audioWrapper ){
- var duration = audioWrapper.duration;
+function X_Audio_getEndTime( audioBase ){
+ var duration = audioBase.duration;
- if( audioWrapper.looped && 0 <= audioWrapper.loopEndTime ){
- if( duration <= audioWrapper.loopEndTime ) return duration;
- return audioWrapper.loopEndTime;
+ if( audioBase.looped && 0 <= audioBase.loopEndTime ){
+ if( duration <= audioBase.loopEndTime ) return duration;
+ return audioBase.loopEndTime;
};
- if( audioWrapper.endTime < 0 || duration <= audioWrapper.endTime ) return duration;
- return audioWrapper.endTime;
+ if( audioBase.endTime < 0 || duration <= audioBase.endTime ) return duration;
+ return audioBase.endTime;
};