浏览代码

fix opus & vorbis last decode

philippe44 2 年之前
父节点
当前提交
a81d0e0513
共有 2 个文件被更改,包括 10 次插入4 次删除
  1. 6 2
      components/squeezelite/opus.c
  2. 4 2
      components/squeezelite/vorbis.c

+ 6 - 2
components/squeezelite/opus.c

@@ -44,6 +44,7 @@
 
 struct opus {
 	struct OggOpusFile *of;
+	bool end;
 #if FRAME_BUF
 	u8_t *write_buf;
 #endif
@@ -118,7 +119,7 @@ static decode_state opus_decompress(void) {
 
 	LOCK_S;
 
-	if (stream.state <= DISCONNECT && !_buf_used(streambuf)) {
+	if (stream.state <= DISCONNECT && u->end) {
 		UNLOCK_S;
 		return DECODE_COMPLETE;
 	}
@@ -170,6 +171,8 @@ static decode_state opus_decompress(void) {
 		frames = process.max_in_frames;
 		write_buf = process.inbuf;
 	);
+	
+	u->end = frames == 0;
 
 	// write the decoded frames into outputbuf then unpack them (they are 16 bits)
 	n = OP(u, read, u->of, (opus_int16*) write_buf, frames * channels, NULL);
@@ -260,7 +263,8 @@ static void opus_open(u8_t size, u8_t rate, u8_t chan, u8_t endianness) {
 	} else {
 		OP(u, free, u->of);
 		u->of = NULL;
-	}	
+	}
+	u->end = false;
 }
 
 static void opus_close(void) {

+ 4 - 2
components/squeezelite/vorbis.c

@@ -54,7 +54,7 @@
 
 struct vorbis {
 	OggVorbis_File *vf;
-	bool opened;
+	bool opened, end;
 #if FRAME_BUF	
 	u8_t *write_buf;
 #endif	
@@ -140,7 +140,7 @@ static decode_state vorbis_decode(void) {
 
 	LOCK_S;
 
-	if (stream.state <= DISCONNECT && !_buf_used(streambuf)) {
+	if (stream.state <= DISCONNECT && v->end) {
 		UNLOCK_S;
 		return DECODE_COMPLETE;
 	}
@@ -204,6 +204,7 @@ static decode_state vorbis_decode(void) {
 	);
 	
 	bytes = frames * 2 * channels; // samples returned are 16 bits
+	v->end = frames == 0;
 
 	// write the decoded frames into outputbuf even though they are 16 bits per sample, then unpack them
 #ifdef TREMOR_ONLY	
@@ -324,6 +325,7 @@ static void vorbis_close(void) {
 	v->write_buf = NULL;
 #endif	
 	v->vf = NULL;
+	v->end = false;
 }
 
 static bool load_vorbis() {