var X_Audio_constructor = 3.1 <= X_UA[ 'Safari' ] && X_UA[ 'Safari' ] < 4 ?
function( s, a ){
- a = document.createElement( 'audio' );
- a.src = s;
- a.load();
+ //a = document.createElement( 'audio' );
+ //a.src = s;
+ //a.load();
return a;
} :
// Android1.6 + MobileOpera12 HTMLAudio はいるが呼ぶとクラッシュする
};
-var X_WebAudio_context = !X_UA[ 'iPhone_4s' ] && !X_UA[ 'iPad_2Mini1' ] && !X_UA[ 'iPod_4' ] &&
- // TODO なんで fennec を禁止?
- !( X_UA[ 'Gecko' ] && X_UA[ 'Android' ] ) &&
+var X_WebAudio_context = // 4s 以下ではない iPad 2G または iPad mini 1G 以下ではない, iPod touch 4G 以下ではない
+ !X_UA[ 'iPhone_4s' ] && !X_UA[ 'iPad_2Mini1' ] && !X_UA[ 'iPod_4' ] &&
+ // Android2 + Gecko で WebAudio が極めて不安定
+ !( X_UA[ 'Fennec' ] && X_UA[ 'Android' ] < 3 ) &&
+ // AOSP でも WebAudio を不完全に実装するものがある, touch の有無も不明のため一律に切ってしまう
+ !X_UA[ 'AOSP' ] && !( X_UA[ 'ChromeWV' ] < 5 ) &&
+ // Blink HTMLAudio 調査用
+ //!X_UA[ 'Blink' ] &&
// Firefox40.0.5 + Windows8 で音声が途中から鳴らなくなる
// Firefox41.0.1 + Windows8 で音声が途中から鳴らなくなる
!( 40 <= X_UA[ 'Gecko' ] && X_UA[ 'Gecko' ] < 42 && X_UA[ 'Windows' ] ) &&
( window[ 'AudioContext' ] || window[ 'webkitAudioContext' ] ),
- X_WebAudio_BUFFER_LIST = [],
+ X_WebAudio_BUFFER_LIST = [],
+ X_WebAudio_need1stTouch = X_UA[ 'iOS' ],
+ X_WebAudio_touchState = X_WebAudio_need1stTouch,
X_WebAudio,
X_WebAudio_BufferLoader,
X_WebAudio_fpsFix;
},
handleEvent : function( e ){
+ var i, l;
+
switch( e.type ){
case X_EVENT_PROGRESS :
- this[ 'dispatch' ]( { type : 'progress', 'percent' : e[ 'percent' ] } );
+ for( i = 0, l = this.webAudioList.length; i < l; ++i ){
+ this.webAudioList[ i ][ 'dispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : e[ 'percent' ] } );
+ };
return;
case X_EVENT_SUCCESS :
i = list.indexOf( webAudio );
if( 0 < i ){
list.splice( i, 1 );
- if( list.length ){
+ if( !list.length ){
this.xhr && this.xhr[ 'kill' ]();
this[ 'kill' ]();
};
gainNode : null,
_onended : null,
- 'Constructor' : function( target, url, option ){
+ 'Constructor' : function( disatcher, url, option ){
var i = 0,
l = X_WebAudio_BUFFER_LIST.length,
loader;
this.loader = loader = X_WebAudio_BufferLoader( this, url );
};
- this.target = target || this;
-
+ this.disatcher = disatcher || this;
this.setState( option );
this[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, this.onKill );
if ( !buffer ) {
this.error = loader.errorState;
- this.target[ 'dispatch' ]({
+ this.disatcher[ 'dispatch' ]({
type : X_EVENT_ERROR,
error : loader.errorState,
message : loader.errorState === 1 ?
this.audioBuffer = buffer;
this.duration = buffer.duration * 1000;
- this.target[ 'asyncDispatch' ]( X_EVENT_READY );
-
- console.log( 'WebAudio buffer ready' );
-
- this.autoplay && X_Timer_once( 16, this, this.play );
-
+ this.disatcher[ 'asyncDispatch' ]( X_WebAudio_touchState ? X_EVENT_MEDIA_TOUCH_FOR_LOAD : X_EVENT_READY );
},
actualPlay : function(){
- var begin, end;
+ var e, begin, end;
+
+ console.log( '[WebAudio] play abuf:' + !!this.audioBuffer );
if( !this.audioBuffer ){
- this.autoplay = true;
+ this._playReserved = true;
return;
};
+ if( X_WebAudio_touchState ){
+ e = X_EventDispatcher_CURRENT_EVENTS[ X_EventDispatcher_CURRENT_EVENTS.length - 1 ];
+ if( !e || !e[ 'pointerType' ] ){
+ // alert( 'タッチイベント以外での play! ' + ( e ? e.type : '' ) );
+ return;
+ };
+ // http://qiita.com/uupaa/items/e5856e3cb2a9fc8c5507
+ // iOS9 + touchstart で呼んでいた場合、 X_ViewPort['listenOnce']('pointerup',this,this.actualPlay())
+ this.disatcher[ 'asyncDispatch' ]( X_EVENT_READY );
+ };
+ X_WebAudio_touchState = false;
+
end = X_Audio_getEndTime( this );
begin = X_Audio_getStartTime( this, end, true );
_sourceDispose : function(){
this.bufferSource.disconnect();
- delete this.bufferSource.onended;
+ //delete this.bufferSource.onended;
delete this.bufferSource;
},
delete this._interval;
return X_CALLBACK_UN_LISTEN;
};
- this.target[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING );
+ this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING );
},
_onEnded : function(){
};
if( this.autoLoop ){
- if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){
+ if( !( this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){
this.looped = true;
- this.target[ 'dispatch' ]( X_EVENT_MEDIA_LOOPED );
+ this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_LOOPED );
this.actualPlay();
};
} else {
this.actualPause();
- this.target[ 'dispatch' ]( X_EVENT_MEDIA_ENDED );
+ this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_ENDED );
};
};
},
actualPause : function(){
- //if( !this.playing ) return this;
-
console.log( '[WebAudio] pause' );
- this.seekTime = this.getActualCurrentTime();
-
this._timerID && X_Timer_remove( this._timerID );
delete this._timerID;
delete this.playing;
if( this.bufferSource ){
- if( this.bufferSource.onended ) delete this.bufferSource.onended;
+ //if( this.bufferSource.onended ) delete this.bufferSource.onended;
this.bufferSource.stop ?
this.bufferSource.stop( 0 ) : this.bufferSource[ 'noteOff' ]( 0 );