Skip to content

Commit 36cb16a

Browse files
authored
Merge pull request #17 from membraneframework/fix-handling-demands
Fix handling demands (multiple buffers)
2 parents 297c33d + df3f0c6 commit 36cb16a

3 files changed

Lines changed: 38 additions & 17 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ The package can be installed by adding `membrane_generator_plugin` to your list
1515
```elixir
1616
def deps do
1717
[
18-
{:membrane_generator_plugin, "~> 0.7.0"}
18+
{:membrane_generator_plugin, "~> 0.7.1"}
1919
]
2020
end
2121
```

lib/silence_generator.ex

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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
81102
end

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
defmodule Membrane.Generator.Plugin.Mixfile do
22
use Mix.Project
33

4-
@version "0.7.0"
4+
@version "0.7.1"
55
@github_url "https://github.com/membraneframework/membrane_generator_plugin"
66

77
def project do

0 commit comments

Comments
 (0)