瀏覽代碼

fixed loading delay in JS (close #392)

ncannasse 7 年之前
父節點
當前提交
6e099f26a2
共有 4 個文件被更改,包括 16 次插入3 次删除
  1. 1 0
      hxd/snd/Channel.hx
  2. 4 0
      hxd/snd/Data.hx
  3. 6 3
      hxd/snd/Manager.hx
  4. 5 0
      hxd/snd/Mp3Data.hx

+ 1 - 0
hxd/snd/Channel.hx

@@ -20,6 +20,7 @@ class Channel extends ChannelBase {
 	var audibleGain     : Float;
 	var lastStamp       : Float;
 	var isVirtual       : Bool;
+	var isLoading		: Bool;
 	var positionChanged : Bool;
 	var queue           : Array<hxd.res.Sound>;
 

+ 4 - 0
hxd/snd/Data.hx

@@ -15,6 +15,10 @@ class Data {
 
 	public var duration(get, never) : Float;
 
+	public function isLoading() {
+		return false;
+	}
+
 	public function decode( out : haxe.io.Bytes, outPos : Int, sampleStart : Int, sampleCount : Int ) : Void {
 		var bpp = getBytesPerSample();
 		if( sampleStart < 0 || sampleCount < 0 || outPos < 0 || outPos + sampleCount * bpp > out.length ) {

+ 6 - 3
hxd/snd/Manager.hx

@@ -191,7 +191,8 @@ class Manager {
 		c.soundGroup   = soundGroup;
 		c.channelGroup = channelGroup;
 		c.next         = channels;
-		c.isVirtual    = (driver == null);
+		c.isLoading    = sdat.isLoading();
+		c.isVirtual    = driver == null;
 
 		channels = c;
 		return c;
@@ -200,7 +201,7 @@ class Manager {
 	function updateVirtualChannels(now : Float) {
 		var c = channels;
 		while (c != null) {
-			if (c.pause || !c.isVirtual) {
+			if (c.pause || !c.isVirtual || c.isLoading) {
 				c = c.next;
 				continue;
 			}
@@ -326,7 +327,9 @@ class Manager {
 		var c = channels;
 		while (c != null) {
 			c.calcAudibleGain(now);
-			c.isVirtual = c.pause || c.mute || c.channelGroup.mute || c.audibleGain < 1e-5;
+			if( c.isLoading && !c.sound.getData().isLoading() )
+				c.isLoading = false;
+			c.isVirtual = c.pause || c.mute || c.channelGroup.mute || c.audibleGain < 1e-5 || c.isLoading;
 			c = c.next;
 		}
 

+ 5 - 0
hxd/snd/Mp3Data.hx

@@ -61,6 +61,11 @@ class Mp3Data extends Data {
 
 
 	#if js
+
+	override function isLoading() {
+		return buffer == null;
+	}
+
 	override public function load(onEnd:Void->Void) {
 		if( buffer != null ) onEnd() else this.onEnd = onEnd;
 	}