Browse Source

more aac correction - release

Philippe G 4 years ago
parent
commit
c33635f35c
2 changed files with 16 additions and 9 deletions
  1. 1 1
      components/squeezelite/alac.c
  2. 15 8
      components/squeezelite/helix-aac.c

+ 1 - 1
components/squeezelite/alac.c

@@ -358,7 +358,7 @@ static decode_state alac_decode(void) {
 		return DECODE_COMPLETE;
 	}
 
-	// enough data for coding
+	// is there enough data for decoding
 	if (bytes < block_size) {
 		UNLOCK_S;
 		return DECODE_RUNNING;

+ 15 - 8
components/squeezelite/helix-aac.c

@@ -389,19 +389,25 @@ static decode_state helixaac_decode(void) {
 		}
 
 		if (found == 1) {
-
-			LOG_INFO("samplerate: %u channels: %u", samplerate, channels);
-			bytes_total = _buf_used(streambuf);
-			bytes_wrap  = min(bytes_total, _buf_cont_read(streambuf));
-
 			LOCK_O;
-			LOG_INFO("setting track_start");
 			output.next_sample_rate = decode_newstream(samplerate, output.supported_rates);
 			IF_DSD( output.next_fmt = PCM; )
 			output.track_start = outputbuf->writep;
 			if (output.fade_mode) _checkfade(true);
 			decode.new_stream = false;
 			UNLOCK_O;
+			
+			LOG_INFO("setting track start, samplerate: %u channels: %u", samplerate, channels);
+			
+			bytes_total = _buf_used(streambuf);
+			bytes_wrap  = min(bytes_total, _buf_cont_read(streambuf));
+
+			// come back later if we don' thave enough data			
+			if (bytes_total < WRAPBUF_LEN) {
+				UNLOCK_S;
+				LOG_INFO("need more audio data");
+				return DECODE_RUNNING;
+			}
 
 		} else if (found == -1) {
 
@@ -418,8 +424,9 @@ static decode_state helixaac_decode(void) {
 		}
 	}
 
-	if (bytes_wrap < WRAPBUF_LEN && (bytes_total > WRAPBUF_LEN || stream.state <= DISCONNECT)) {
-		// make a local copy of frames which may have wrapped round the end of streambuf
+	// we always have at least WRAPBUF_LEN unless it's the end of a stream
+	if (bytes_wrap < WRAPBUF_LEN) {
+		// build a linear buffer if we are crossing the end of streambuf
 		memcpy(a->wrap_buf, streambuf->readp, bytes_wrap);
 		memcpy(a->wrap_buf + bytes_wrap, streambuf->buf, min(WRAPBUF_LEN, bytes_total) - bytes_wrap);