• R/O
  • HTTP
  • SSH
  • HTTPS

clientJs: コミット

クライアント側 js 開発用


コミットメタ情報

リビジョンb05bf97c1b3b1720e73af54017a48291a364d394 (tree)
日時2016-03-30 07:33:27
作者itozyun <itozyun@user...>
コミッターitozyun

ログメッセージ

Version 0.6.216, bug fixes X.WebAudio.

変更サマリ

差分

--- a/0.6.x/js/01_core/13_XClass.js
+++ b/0.6.x/js/01_core/13_XClass.js
@@ -25,7 +25,10 @@ var
2525 X_Class_traits = null,
2626 X_Class_useObjectCreate = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf
2727 // Opera Mobile 12.10 Android11 IS01 でクラスのメンバが欠落する問題に遭遇。__proto__ を辞めると動作,,,
28- X_Class_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X_emptyFunction.prototype.__proto__,
28+ X_Class_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] &&
29+ // Android で原因不明のエラーに遭遇しているのは、この辺りが怪しい... 2016.3.9
30+ !X_UA[ 'AOSP' ] && !X_UA[ 'ChromeWV' ] &&
31+ !!X_emptyFunction.prototype.__proto__,
2932 X_Class_constructorFix = X_UA[ 'AOSP' ] < 3 || X_UA[ 'iOS' ] < 5,
3033 X_Class_SEAL_KILLING = [],
3134
--- a/0.6.x/js/02_dom/10_XNodeAnime.js
+++ b/0.6.x/js/02_dom/10_XNodeAnime.js
@@ -202,6 +202,9 @@ function X_Node_animate( obj ){
202202 obj.phase = 4; // 強制停止(GPU転送予約)または値のみ更新
203203 obj.releaseNow = false; // TODO folower がいるため GPU 転送できないケースあり
204204 X_NodeAnime_needsDetection = true;
205+ } else {
206+ obj.phase = 1;
207+ X_NodeAnime_needsDetection = true;
205208 };
206209
207210 if( !X_NodeAnime_reserved ){
--- a/0.6.x/js/05_util/04_XXML.js
+++ b/0.6.x/js/05_util/04_XXML.js
@@ -85,6 +85,7 @@ function XMLWrapper_get( index ){
8585
8686 /**
8787 * セレクターにヒットした要素の内容を指定されたデータ型で返す。複数要素にヒットした場合、0番目の要素の内容を使用する。
88+ * '' をセレクタとして渡すとノードの値を返す
8889 * @alias X.XML.prototype.val
8990 * @param {string} queryString XML セレクター文字列
9091 * @param {string} type 'number','int','boolean','string'
--- a/0.6.x/js/06_net/04_XNetImage.js
+++ b/0.6.x/js/06_net/04_XNetImage.js
@@ -6,7 +6,7 @@
66 * AUTHOR: uupaa.js@gmail.com
77 *
88 */
9-var X_ImgLoader_image = window[ 'Image' ] && new Image(),
9+var X_ImgLoader_image = window[ 'Image' ] && new Image(), // ここで無用なアクセスをIEがしているかも
1010 // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する
1111 X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_image ),
1212 // http://uupaa.hatenablog.com/entry/2013/12/17/171809
--- a/0.6.x/js/07_audio/01_XWebAudio.js
+++ b/0.6.x/js/07_audio/01_XWebAudio.js
@@ -90,7 +90,7 @@ var X_WebAudio_context = // 4s 以下ではない iPad 2G または iPad mi
9090 //!X_UA[ 'Blink' ] &&
9191 // Firefox40.0.5 + Windows8 で音声が途中から鳴らなくなる
9292 // Firefox41.0.1 + Windows8 で音声が途中から鳴らなくなる
93- !( 40 <= X_UA[ 'Gecko' ] && X_UA[ 'Gecko' ] < 45 && X_UA[ 'Windows' ] ) &&
93+ !( 40 <= X_UA[ 'Gecko' ] && X_UA[ 'Gecko' ] < 46 && X_UA[ 'Windows' ] ) &&
9494 ( window[ 'AudioContext' ] || window[ 'webkitAudioContext' ] ),
9595 X_WebAudio_BUFFER_LIST = [],
9696 X_WebAudio_need1stTouch = X_UA[ 'iOS' ],
@@ -229,7 +229,7 @@ if( X_WebAudio_context ){
229229 audioBuffer : null,
230230 bufferSource : null,
231231 gainNode : null,
232- _onended : null,
232+ //_onended : null,
233233
234234 'Constructor' : function( disatcher, url, option ){
235235 var i = 0,
@@ -280,7 +280,7 @@ if( X_WebAudio_context ){
280280 this.playing && this.actualPause();
281281 this.bufferSource && this._sourceDispose();
282282
283- this._onended && X_Closure_correct( this._onended );
283+ //this._onended && X_Closure_correct( this._onended );
284284
285285 this.gainNode && this.gainNode.disconnect();
286286 },
@@ -334,17 +334,24 @@ if( X_WebAudio_context ){
334334 end = X_Audio_getEndTime( this );
335335 begin = X_Audio_getStartTime( this, end, true );
336336
337- console.log( '[WebAudio] play ' + begin + ' -> ' + end );
337+ console.log( '[WebAudio] play ' + begin + ' -> ' + end + ' loop: ' + this.autoLoop + ' :' + this.loopStartTime + ' -> ' + this.loopEndTime );
338338
339339 if( this.bufferSource ) this._sourceDispose();
340340 if( !this.gainNode ){
341341 this.gainNode = X_WebAudio_context[ 'createGain' ] ? X_WebAudio_context[ 'createGain' ]() : X_WebAudio_context[ 'createGainNode' ]();
342- this.gainNode[ 'connect' ]( X_WebAudio_context[ 'destination' ] );
342+ this.gainNode[ 'connect' ]( X_WebAudio_context[ 'destination' ] );
343343 };
344+
344345 this.bufferSource = X_WebAudio_context[ 'createBufferSource' ]();
345346 this.bufferSource.buffer = this.audioBuffer;
346- this.bufferSource[ 'connect' ]( this.gainNode );
347347
348+ /* win8.1 Firefox45, win8.1 Chrome48 で動かなくなる...
349+ if( this.bufferSource[ 'loop' ] = this.autoLoop ){
350+ this.bufferSource[ 'loopStart' ] = 0 <= this.loopStartTime ? this.loopStartTime / 1000 : begin / 1000;
351+ this.bufferSource[ 'loopEnd' ] = 0 <= this.loopEndTime ? this.loopEndTime / 1000 : end / 1000;
352+ }; */
353+
354+ this.bufferSource[ 'connect' ]( this.gainNode );
348355 this.gainNode[ 'gain' ].value = this.gain;
349356
350357 // おかしい、stop 前に外していても呼ばれる、、、@Firefox33.1
@@ -359,17 +366,19 @@ if( X_WebAudio_context ){
359366 //};
360367
361368 if( this.bufferSource.start ){
362- this.bufferSource.start( 0, begin / 1000, end / 1000 );
369+ this.bufferSource.start( 0, begin / 1000, ( end - begin ) / 1000 );
370+ } else
371+ if( this.bufferSource[ 'noteOn' ] ){
372+ this.bufferSource[ 'noteOn' ]( 0, begin / 1000, ( end - begin ) / 1000 );
363373 } else {
364- this.bufferSource[ 'noteGrainOn' ]( 0, begin / 1000, end / 1000 );
374+ this.bufferSource[ 'noteGrainOn' ]( 0, begin / 1000, ( end - begin ) / 1000 );
365375 };
366376
367377 this.playing = true;
368378 this._startPos = begin;
369379 this._endPosition = end;
370380 this._startTime = X_WebAudio_context.currentTime * 1000;
371- // this._interval = this._interval || X_Timer_add( 1000, 0, this, this._onInterval );
372- this._interval = this._interval || X_Timer_add( 100, 0, this, this._onEnded );
381+ this._interval = this._interval || X_Timer_add( 100, 0, this, this._onInterval );
373382 },
374383
375384 _sourceDispose : function(){
@@ -387,25 +396,18 @@ if( X_WebAudio_context ){
387396 this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING );
388397 }, */
389398
390- _onEnded : function(){
399+ _onInterval : function(){
391400 var time;
392- //delete this._timerID;
393401
394402 if( this.playing ){
403+ // TODO 再生中に終了時間だけ変えた場合!
395404 time = X_WebAudio_context.currentTime * 1000 - this._startTime - this._endPosition + this._startPos | 0;
396405 //console.log( '> onEnd ' + ( this.playing && ( X_WebAudio_context.currentTime * 1000 - this._startTime ) ) + ' < ' + ( this._endPosition - this._startPos ) );
397- if( this._onended ){
398- // Firefox 用の対策,,,
399- if( time < 0 ) return;
400- } else {
401- if( time < 0 ){
402- this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING );
403- //console.log( '> onEnd crt:' + ( X_WebAudio_context.currentTime * 1000 ) + ' startTime:' + this._startTime +
404- // ' from:' + this._startPos + ' to:' + this._endPosition );
405- // this._timerID = X_Timer_once( -time, this, this._onEnded );
406- return;
407- };
408- };
406+
407+ if( time < 0 ){
408+ this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING );
409+ return;
410+ };
409411
410412 if( this.autoLoop ){
411413 if( !( this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){
@@ -426,15 +428,11 @@ if( X_WebAudio_context ){
426428 actualPause : function(){
427429 console.log( '[WebAudio] pause' );
428430
429- //this._timerID && X_Timer_remove( this._timerID );
430- //delete this._timerID;
431431 this._interval && X_Timer_remove( this._interval );
432432 delete this._interval;
433433 delete this.playing;
434434
435435 if( this.bufferSource ){
436- //if( this.bufferSource.onended ) delete this.bufferSource.onended;
437-
438436 this.bufferSource.stop ?
439437 this.bufferSource.stop( 0 ) : this.bufferSource[ 'noteOff' ]( 0 );
440438 };
--- a/0.6.x/js/07_audio/02_XHTMLAudio.js
+++ b/0.6.x/js/07_audio/02_XHTMLAudio.js
@@ -229,11 +229,10 @@ if( X_Audio_constructor ){
229229 // opera Android 12 で buffered.end() へのアクセスはエラー try catch も無効、iem9 は常に end(0) = 0
230230 if( X_HTMLAudio_progressEnabled && this.duration && this._readyState < 3 ){
231231 buf = raw.buffered;
232- time = 0;
233- for( i = 0, l = buf.length; i < l; ++i ){
232+ for( i = time = 0, l = buf && buf.length; i < l; ++i ){
234233 time += buf[ 'end' ]( i ) - buf[ 'start' ]( i );
235234 };
236- this.disatcher[ 'dispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : time * 1000 / this.duration } );
235+ this.disatcher[ 'dispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : time * 1000 / this.duration * 100 } );
237236 };
238237 break;
239238
旧リポジトリブラウザで表示