diff options
author | Jie Yang <yang.jie@intel.com> | 2013-09-24 10:23:01 +0800 |
---|---|---|
committer | Zhang,Vivian <vivian.zhang@intel.com> | 2013-09-24 10:46:03 +0800 |
commit | 910afb49c71357e257683572867c13023e8e3f13 (patch) | |
tree | 3be71479b3419c8fb306d314a305d6a69a0f774e | |
parent | 808e332d85d6acc53ea80eeb655a1a1b95e0c6d4 (diff) | |
download | gst-plugins-audio-hwdec-devel/audiohwdec.tar.gz gst-plugins-audio-hwdec-devel/audiohwdec.tar.bz2 gst-plugins-audio-hwdec-devel/audiohwdec.zip |
check the real written bytes, continue the rest bytes, to fix PLAYING-->PAUSED buffer data dropping issuedevel/audiohwdec
-rwxr-xr-x | audiohwdec/src/gsttinycompresssink.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/audiohwdec/src/gsttinycompresssink.c b/audiohwdec/src/gsttinycompresssink.c index cb89845..8cd8ccf 100755 --- a/audiohwdec/src/gsttinycompresssink.c +++ b/audiohwdec/src/gsttinycompresssink.c @@ -587,7 +587,7 @@ gst_tinycompress_ringbuffer_commit (GstRingBuffer * buf, guint64 * sample, GstTinyCompressRingBuffer *tbuf; gint bps; gint64 payload_offset = 0; - guint payload_len; + guint payload_len, written_bytes = 0; gboolean open_ret; const char encaped_fix_header[TINYCOMPRESSENCAP_FIXED_HEADER_SIZE] = TINYCOMPRESSENCAP_FIXED_HEADER; @@ -638,10 +638,10 @@ gst_tinycompress_ringbuffer_commit (GstRingBuffer * buf, guint64 * sample, while (!tsink->priv->t_started) { open_ret = tinycompress_start (tsink, tsink->priv->buff, tsink->priv->valid_buff_size); - tinycompresssink_clear_buffer (tsink); if (open_ret) { GST_LOG_OBJECT (tsink, "now tinycompress device is started!"); + tinycompresssink_clear_buffer (tsink); break; } if (!tinycompresssink_fill_buffer (tsink, (data+payload_offset + payload_len - tsink->priv->pending_buff_size), tsink->priv->pending_buff_size)) @@ -651,11 +651,19 @@ gst_tinycompress_ringbuffer_commit (GstRingBuffer * buf, guint64 * sample, tsink->priv->valid_buff_size = tsink->priv->t_config.fragment_size; while (tinycompresssink_fill_buffer (tsink, (data+payload_offset + payload_len - tsink->priv->pending_buff_size), tsink->priv->pending_buff_size)) { - tinycompress_write (tsink, tsink->priv->buff, tsink->priv->valid_buff_size); - tinycompresssink_clear_buffer (tsink); - if (tsink->priv->need_to_drain) { - tinycompress_drain (tsink); - tsink->priv->need_to_drain = FALSE; + written_bytes = tinycompress_write (tsink, tsink->priv->buff, tsink->priv->valid_buff_size); + if (written_bytes != tsink->priv->valid_buff_size) { + /* writting abnormal, reset pending_buff_size, return the number of samples, maybe the writting is paused by status changing. return here then we can continue the rendering later. */ + tsink->priv->pending_buff_size = 0; + GST_LOG_OBJECT (tsink, "only %d bytes are written to the devices!", written_bytes); + GST_TINYCOMPRESSSINK_UNLOCK (tsink); + return written_bytes / bps; + } else { + tinycompresssink_clear_buffer (tsink); + if (tsink->priv->need_to_drain) { + tinycompress_drain (tsink); + tsink->priv->need_to_drain = FALSE; + } } } @@ -1041,7 +1049,7 @@ gst_tinycompresssink_flush_ringbuffer (GstTinyCompressSink * tsink) tinycompress_write (tsink, tsink->priv->buff, tsink->priv->filled_buff_size); tinycompresssink_clear_buffer (tsink); - tsink->priv->need_to_drain = TRUE; + tsink->priv->need_to_drain = FALSE; if (tsink->priv->need_to_drain) { tinycompress_drain (tsink); tsink->priv->need_to_drain = FALSE; @@ -1573,6 +1581,7 @@ tinycompress_write(GstTinyCompressSink *tsink, gpointer data, guint length) if (written < 0) goto write_error; + GST_LOG_OBJECT (tsink, "Tinycompress finished write %d bytes to device!", written); return written; not_opened: |