X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F07_audio%2F00_XAudio.js;h=5418dfa5e9618b5cd6baf4445c61226f39b9c1b7;hb=78f2b6b1bb07448d1c314775bf28a41b7111e386;hp=945aa925bbd15454f9f2483d895445f259befc7b;hpb=94c39d10a21853703c90cb09b1e82bd7a2d8923e;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 945aa92..5418dfa 100644 --- a/0.6.x/js/07_audio/00_XAudio.js +++ b/0.6.x/js/07_audio/00_XAudio.js @@ -14,7 +14,8 @@ X.Audio = { } }; -var X_Audio_BACKENDS = []; +var X_Audio_BACKENDS = [], + X_Audio_WRAPPER_LIST = []; /* * TODO preplayerror play してみたら error が出た、backend の変更。 @@ -62,6 +63,12 @@ function X_Audio_detectComplete( e, proxy, option, sourceList, source, ext, sup }; }; +function X_AudioProxy_getAudioWrapper( proxy ){ + var i = X_Audio_WRAPPER_LIST.length; + for( ; i; ){ + if( X_Audio_WRAPPER_LIST[ --i ].proxy === proxy ) return X_Audio_WRAPPER_LIST[ i ]; + }; +}; var X_AudioProxy = X.EventDispatcher.inherits( 'X.AV.AudioProxy', @@ -77,51 +84,53 @@ var X_AudioProxy = X.EventDispatcher.inherits( }, close : function(){ - return this._backend !== -1 && X_Audio_BACKENDS[ this._backend ].close( this ); + return this._backend !== -1 && X_AudioProxy_getAudioWrapper( this ).close(); }, - play : function( startTime, endTime, loop, loopStartTime ){ + play : function( startTime, endTime, loop, loopStartTime, loopEndTime ){ var state, duration; - if( startTime ){ + if( 0 <= startTime ){ this.state( { + currentTime : startTime, startTime : startTime, endTime : endTime, loop : loop, - loopStartTime : loopStartTime + loopStartTime : loopStartTime, + loopEndTime : loopEndTime } ); }; - this._backend !== -1 && X_Audio_BACKENDS[ this._backend ].play( this ); + this._backend !== -1 && X_AudioProxy_getAudioWrapper( this ).play(); return this; }, seek : function( seekTime ){ - var state = this.state(); - if( state.playing ){ - seekTime < state.endTime && this.state( { currentTime : seekTime } ); - } else { - this.state( { startTime : seekTime } ); + var state = this.state(), + end = X_AudioWrapper_getEndTime( X_AudioProxy_getAudioWrapper( this ) ); + if( seekTime < end ){ + this.state( { currentTime : seekTime } ); }; return this; }, pause : function(){ - this.state().playing && X_Audio_BACKENDS[ this._backend ].pause( this ); + this.state().playing && X_AudioProxy_getAudioWrapper( this ).pause(); return this; }, state : function( obj ){ - var backend = this._backend !== -1 && X_Audio_BACKENDS[ this._backend ]; + var backend = this._backend !== -1 && X_AudioProxy_getAudioWrapper( this ); if( obj === undefined ){ return backend ? - backend.state( this ) : + backend.state() : { startTime : -1, endTime : -1, loopStartTime : -1, + loopEndTime : -1, currentTime : -1, loop : false, - loaded : false, + looded : false, error : false, playing : false, @@ -129,39 +138,39 @@ var X_AudioProxy = X.EventDispatcher.inherits( duration : 0 }; }; - backend && backend.state( this, obj ); + backend && backend.state( obj ); return this; }, loop : function( v ){ - var backend = this._backend !== -1 && X_Audio_BACKENDS[ this._backend ]; + var backend = this._backend !== -1 && X_AudioProxy_getAudioWrapper( this ); if( v === undefined ){ - return backend && backend.state( this ).loop; + return backend && backend.state().loop; }; - backend && backend.state( this, { loop : v } ); + backend && backend.state( { loop : v } ); return this; }, volume : function( v ){ - var backend = this._backend !== -1 && X_Audio_BACKENDS[ this._backend ]; + var backend = this._backend !== -1 && X_AudioProxy_getAudioWrapper( this ); if( v === undefined ){ - return backend && backend.state( this ).volume; + return backend && backend.state().volume; }; - backend && backend.state( this, { volume : v } ); + backend && backend.state( { volume : v } ); return this; }, currentTime : function( v ){ - var backend = this._backend !== -1 && X_Audio_BACKENDS[ this._backend ]; + var backend = this._backend !== -1 && X_AudioProxy_getAudioWrapper( this ); if( v === undefined ){ - return backend && backend.state( this ).currentTime; + return backend && backend.state().currentTime; }; - backend && backend.state( this, { currentTime : v } ); + backend && backend.state( { currentTime : v } ); return this; }, isPlaying : function(){ - return this._backend !== -1 && X_Audio_BACKENDS[ this._backend ].state( this ).playing; + return this._backend !== -1 && X_AudioProxy_getAudioWrapper( this ).state().playing; } } @@ -173,7 +182,7 @@ function X_AudioProxy_handleEvent( e ){ this.unlisten( 'nobackend', X_AudioProxy_handleEvent ); this.source = e.source; this.backendName = X_Audio_BACKENDS[ this._backend ].backendName; - X_Audio_BACKENDS[ this._backend ].register( this, e.source, e.option ); + X_Audio_WRAPPER_LIST.push( new X_Audio_BACKENDS[ this._backend ].klass( this, e.source, e.option ) ); break; case 'nobackend' : @@ -202,25 +211,35 @@ function X_AudioWrapper_updateStates( audioWrapper, obj ){ audioWrapper.seekTime = v; seek = 2; }; - break; - }; + } else { + audioWrapper.seekTime = v; + }; } else { continue; }; - k = 'startTime'; + break; case 'startTime' : case 'endTime' : case 'loopStartTime' : + case 'loopEndTime' : v = X_AudioWrapper_timeStringToNumber( v ); - if( X.Type.isNumber( v ) && audioWrapper[ k ] !== v ){ - audioWrapper[ k ] = v; - // 再生中の endTime, currentTime の変更 - if( playing && k === 'endTime' ) end = 1; + console.log( k + ' ' + v ); + if( v || v === 0 ){ + if( audioWrapper[ k ] !== v ){ + audioWrapper[ k ] = v; + + // 再生中の endTime の変更 + if( playing && ( k === 'endTime' || k === 'loopEndTime' ) ) end = 1; + }; + } else { + delete audioWrapper[ k ]; + if( playing && ( k === 'endTime' || k === 'loopEndTime' ) ) end = 1; }; break; case 'loop' : + case 'looped' : if( X.Type.isBoolean( v ) && audioWrapper[ k ] !== v ){ audioWrapper[ k ] = v; }; @@ -239,10 +258,10 @@ function X_AudioWrapper_updateStates( audioWrapper, obj ){ }; }; - if( audioWrapper.endTime <= audioWrapper.startTime || - audioWrapper.endTime <= audioWrapper.loopStartTime || - audioWrapper.endTime < audioWrapper.seekTime || - audioWrapper.duration < audioWrapper.endTime + if( audioWrapper.endTime < audioWrapper.startTime || + ( audioWrapper.loopEndTime < 0 ? audioWrapper.endTime : audioWrapper.loopEndTime ) < ( audioWrapper.loopStartTime < 0 ? audioWrapper.startTime : audioWrapper.loopStartTime ) || + X_AudioWrapper_getEndTime( audioWrapper ) < audioWrapper.seekTime// || + //audioWrapper.duration < audioWrapper.endTime ){ //alert( 'error @updateStateObject() begin:' + audioWrapper.startTime + ' end:' + audioWrapper.endTime + ' d:' + audioWrapper.duration + ' ls:' + audioWrapper.loopStartTime ); return 0; @@ -286,3 +305,34 @@ function X_AudioWrapper_timeStringToNumber( time ){ ms = ( h * 3600 + m * 60 + s ) * 1000 + ms; return ms < 0 ? 0 : ms; }; + +function X_AudioWrapper_getStartTime( audioWrapper, endTime, delSeekTime ){ + var seek = audioWrapper.seekTime; + if( delSeekTime ) delete audioWrapper.seekTime; + + if( 0 <= seek ){ + if( audioWrapper.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( audioWrapper.startTime < 0 || audioWrapper.duration <= audioWrapper.startTime ) return 0; + return audioWrapper.startTime; +}; + +function X_AudioWrapper_getEndTime( audioWrapper ){ + var duration = audioWrapper.duration; + + if( audioWrapper.looped && 0 <= audioWrapper.loopEndTime ){ + if( duration <= audioWrapper.loopEndTime ) return duration; + return audioWrapper.loopEndTime; + }; + + if( audioWrapper.endTime < 0 || duration <= audioWrapper.endTime ) return duration; + return audioWrapper.endTime; +}; +