@@ -27,7 +27,8 @@ defmodule Membrane.Core.Bin do
2727 parent: pid ,
2828 user_options: Membrane.Bin . options_t ( ) ,
2929 parent_clock: Membrane.Clock . t ( ) ,
30- log_metadata: Keyword . t ( )
30+ log_metadata: Keyword . t ( ) ,
31+ sync: :membrane_no_sync
3132 }
3233
3334 @ doc """
@@ -62,11 +63,22 @@ defmodule Membrane.Core.Bin do
6263 bin options: #{ inspect ( user_options ) }
6364 """ )
6465
66+ start_fun =
67+ & GenServer . start_link ( Membrane.Core.Bin , Map . put ( options , :children_supervisor , & 1 ) )
68+
6569 # rpc if necessary
6670 if node do
67- :rpc . call ( node , GenServer , method , [ Membrane.Core.Bin , options ] )
71+ :rpc . call ( node , Membrane.Core.Parent.Supervisor , :go_brrr , [
72+ method ,
73+ start_fun ,
74+ options . setup_logger
75+ ] )
6876 else
69- apply ( GenServer , method , [ Membrane.Core.Bin , options ] )
77+ Membrane.Core.Parent.Supervisor . go_brrr (
78+ method ,
79+ start_fun ,
80+ options . setup_logger
81+ )
7082 end
7183 else
7284 raise """
@@ -76,25 +88,13 @@ defmodule Membrane.Core.Bin do
7688 end
7789 end
7890
79- @ doc """
80- Changes bin's playback state to `:stopped` and terminates its process
81- """
82- @ spec stop_and_terminate ( bin :: pid ) :: :ok
83- def stop_and_terminate ( bin ) do
84- Message . send ( bin , :terminate )
85- :ok
86- end
87-
8891 @ impl GenServer
8992 def init ( options ) do
90- % { parent: parent , name: name , module: module , log_metadata: log_metadata } = options
91-
92- Process . monitor ( parent )
93-
94- name_str = if String . valid? ( name ) , do: name , else: inspect ( name )
95- :ok = Membrane.Logger . set_prefix ( name_str <> " bin" )
96- :ok = Logger . metadata ( log_metadata )
97- :ok = ComponentPath . set_and_append ( log_metadata [ :parent_path ] || [ ] , name_str <> " bin" )
93+ % { name: name , module: module } = options
94+ self_pid = self ( )
95+ setup_logger = fn -> options . setup_logger . ( self_pid ) end
96+ log_metadata = setup_logger . ( )
97+ Message . send ( options . children_supervisor , :setup_logger , setup_logger )
9898
9999 Telemetry . report_init ( :bin )
100100
@@ -116,7 +116,8 @@ defmodule Membrane.Core.Bin do
116116 stream_sync: Sync . no_sync ( ) ,
117117 latency: 0
118118 } ,
119- children_log_metadata: log_metadata
119+ children_log_metadata: log_metadata ,
120+ children_supervisor: options . children_supervisor
120121 }
121122 |> Child.PadSpecHandler . init_pads ( )
122123
@@ -129,7 +130,13 @@ defmodule Membrane.Core.Bin do
129130 state
130131 )
131132
132- { :ok , state }
133+ { :ok , state , { :continue , :init } }
134+ end
135+
136+ @ impl GenServer
137+ def handle_continue ( :init , state ) do
138+ state = Parent.LifecycleController . handle_setup ( state )
139+ { :noreply , state }
133140 end
134141
135142 @ impl GenServer
@@ -153,21 +160,6 @@ defmodule Membrane.Core.Bin do
153160 { :noreply , state }
154161 end
155162
156- @ impl GenServer
157- def handle_info (
158- Message . new ( :playback_state_changed , [ pid , new_playback_state ] ) ,
159- state
160- ) do
161- state = Parent.ChildLifeController . child_playback_changed ( pid , new_playback_state , state )
162- { :noreply , state }
163- end
164-
165- @ impl GenServer
166- def handle_info ( Message . new ( :change_playback_state , new_state ) , state ) do
167- state = Parent.LifecycleController . change_playback_state ( new_state , state )
168- { :noreply , state }
169- end
170-
171163 @ impl GenServer
172164 def handle_info ( Message . new ( :stream_management_event , [ element_name , pad_ref , event ] ) , state ) do
173165 state =
@@ -206,25 +198,32 @@ defmodule Membrane.Core.Bin do
206198 end
207199
208200 @ impl GenServer
209- def handle_info ( { :membrane_clock_ratio , clock , ratio } , state ) do
210- state = TimerController . handle_clock_update ( clock , ratio , state )
201+ def handle_info ( Message . new ( :child_death , [ name , reason ] ) , state ) do
202+ state = Parent.ChildLifeController . handle_child_death ( name , reason , state )
211203 { :noreply , state }
212204 end
213205
214206 @ impl GenServer
215- def handle_info ( { :DOWN , _ref , :process , pid , reason } = message , state ) do
216- cond do
217- is_child_pid? ( pid , state ) ->
218- state = Parent.ChildLifeController . handle_child_death ( pid , reason , state )
219- { :noreply , state }
220-
221- is_parent_pid? ( pid , state ) ->
222- { :stop , { :shutdown , :parent_crash } , state }
223-
224- true ->
225- state = Parent.LifecycleController . handle_info ( message , state )
226- { :noreply , state }
227- end
207+ def handle_info ( Message . new ( :play ) , state ) do
208+ state = Parent.LifecycleController . handle_play ( state )
209+ { :noreply , state }
210+ end
211+
212+ @ impl GenServer
213+ def handle_info ( Message . new ( :initialized , child ) , state ) do
214+ state = Parent.ChildLifeController . handle_child_initialized ( child , state )
215+ { :noreply , state }
216+ end
217+
218+ @ impl GenServer
219+ def handle_info ( Message . new ( _type , _args , _opts ) = message , _state ) do
220+ raise Membrane.BinError , "Received invalid message #{ inspect ( message ) } "
221+ end
222+
223+ @ impl GenServer
224+ def handle_info ( { :membrane_clock_ratio , clock , ratio } , state ) do
225+ state = TimerController . handle_clock_update ( clock , ratio , state )
226+ { :noreply , state }
228227 end
229228
230229 @ impl GenServer
@@ -251,14 +250,6 @@ defmodule Membrane.Core.Bin do
251250 @ impl GenServer
252251 def terminate ( reason , state ) do
253252 Telemetry . report_terminate ( :bin )
254- :ok = state . module . handle_shutdown ( reason , state . internal_state )
255- end
256-
257- defp is_parent_pid? ( pid , state ) do
258- state . parent_pid == pid
259- end
260-
261- defp is_child_pid? ( pid , state ) do
262- Enum . any? ( state . children , fn { _name , entry } -> entry . pid == pid end )
253+ Parent.LifecycleController . handle_terminate ( reason , state )
263254 end
264255end
0 commit comments