@@ -232,6 +232,39 @@ do_connect_pcm(pa_stream *s, snd_pcm_stream_t stream_direction)
232232 return -1 ;
233233}
234234
235+ APULSE_EXPORT
236+ int
237+ pa_stream_begin_write (pa_stream * p , void * * data , size_t * nbytes )
238+ {
239+ trace_info ("F %s p=%p\n" , __func__ , p );
240+
241+ free (p -> write_buffer );
242+
243+ if (* nbytes == (size_t )-1 )
244+ * nbytes = 8192 ;
245+
246+ p -> write_buffer = malloc (* nbytes );
247+
248+ if (!p -> write_buffer )
249+ return -1 ;
250+
251+ * data = p -> write_buffer ;
252+
253+ return 0 ;
254+ }
255+
256+ APULSE_EXPORT
257+ int
258+ pa_stream_cancel_write (pa_stream * p )
259+ {
260+ trace_info ("F %s p=%p\n" , __func__ , p );
261+
262+ free (p -> write_buffer );
263+ p -> write_buffer = NULL ;
264+
265+ return 0 ;
266+ }
267+
235268APULSE_EXPORT
236269int
237270pa_stream_connect_playback (pa_stream * s , const char * dev , const pa_buffer_attr * attr ,
@@ -549,6 +582,7 @@ pa_stream_unref(pa_stream *s)
549582 g_hash_table_remove (s -> c -> streams_ht , GINT_TO_POINTER (s -> idx ));
550583 ringbuffer_free (s -> rb );
551584 free (s -> peek_buffer );
585+ free (s -> write_buffer );
552586 free (s -> name );
553587 free (s );
554588 }
@@ -608,8 +642,14 @@ pa_stream_write(pa_stream *s, const void *data, size_t nbytes, pa_free_cb_t free
608642 size_t written = ringbuffer_write (s -> rb , data , nbytes );
609643 s -> timing_info .since_underrun += written ;
610644 s -> timing_info .write_index += written ;
611- if (free_cb )
612- free_cb ((void * )data );
645+
646+ if (data == s -> write_buffer ) {
647+ free (s -> write_buffer );
648+ s -> write_buffer = NULL ;
649+ } else {
650+ if (free_cb )
651+ free_cb ((void * )data );
652+ }
613653
614654 return 0 ;
615655}
0 commit comments