@@ -49,33 +49,54 @@ defmodule Membrane.SilenceGenerator do
4949 @ impl true
5050 def handle_demand ( :output , size , :bytes , _ctx , % { caps: caps } = state ) do
5151 time = RawAudio . bytes_to_time ( size , caps )
52- do_handle_demand ( time , state )
52+ do_handle_demand ( time , time , state )
5353 end
5454
5555 def handle_demand ( :output , buffers , :buffers , _ctx , state ) do
5656 % { caps: caps , frames_per_buffer: frames_per_buffer } = state
5757
58- time = buffers * RawAudio . frames_to_time ( frames_per_buffer , caps )
59- do_handle_demand ( time , state )
58+ time = RawAudio . frames_to_time ( frames_per_buffer , caps )
59+ do_handle_demand ( time * buffers , time , state )
6060 end
6161
6262 defp do_handle_demand (
63- time ,
63+ total_time ,
64+ chunk_time ,
6465 % { caps: caps , duration: :infinity , passed_time: passed_time } = state
6566 ) do
66- buffer = % Buffer { payload: RawAudio . silence ( caps , time ) , pts: passed_time }
67- { { :ok , buffer: { :output , buffer } } , % { state | passed_time: passed_time + time } }
67+ buffers = generate_buffers ( passed_time , chunk_time , total_time , caps )
68+ state = % { state | passed_time: passed_time + total_time }
69+
70+ { { :ok , buffer: { :output , buffers } } , state }
71+ end
72+
73+ defp do_handle_demand (
74+ total_time ,
75+ chunk_time ,
76+ % { caps: caps , duration: duration , passed_time: passed_time } = state
77+ ) do
78+ total_time = min ( total_time , duration - passed_time )
79+ buffers = generate_buffers ( passed_time , chunk_time , total_time , caps )
80+ state = % { state | passed_time: passed_time + total_time }
81+
82+ if state . passed_time == duration ,
83+ do: { { :ok , buffer: { :output , buffers } , end_of_stream: :output } , state } ,
84+ else: { { :ok , buffer: { :output , buffers } } , state }
6885 end
6986
70- defp do_handle_demand ( time , state ) do
71- % { caps: caps , duration: duration , passed_time: passed_time } = state
87+ defp generate_buffers ( start_time , chunk_time , total_time , caps , buffers \\ [ ] )
88+ defp generate_buffers ( _start_time , _chunk_time , 0 , _caps , buffers ) , do: Enum . reverse ( buffers )
89+
90+ defp generate_buffers ( start_time , chunk_time , total_time , caps , buffers ) do
91+ buffer_time = min ( total_time , chunk_time )
92+
93+ buffer = % Buffer {
94+ payload: RawAudio . silence ( caps , buffer_time ) ,
95+ pts: start_time
96+ }
7297
73- if passed_time + time < duration do
74- buffer = % Buffer { payload: RawAudio . silence ( caps , time ) , pts: passed_time }
75- { { :ok , buffer: { :output , buffer } } , % { state | passed_time: passed_time + time } }
76- else
77- buffer = % Buffer { payload: RawAudio . silence ( caps , duration - passed_time ) , pts: passed_time }
78- { { :ok , buffer: { :output , buffer } , end_of_stream: :output } , % { state | passed_time: duration } }
79- end
98+ generate_buffers ( start_time + buffer_time , chunk_time , total_time - buffer_time , caps , [
99+ buffer | buffers
100+ ] )
80101 end
81102end
0 commit comments