@startuml
autonumber
box "Container" #LightGreen
participant Netflix
participant "DPI\n(IElementaryStreamAudioPlayer)" as DPI
participant GStreamer_client
participant rialtoClient
end box
box "Platform" #LightBlue
participant rialtoServer
participant GStreamerrdk_gstreamer_serverutils
end box
note across
disable()/flush()/enable()/firstSampleAvailable() call sequence is guaranteed by Netflix but is only
used to detect that an audio stream switch has been initiated in DPI implementation.
end note
Netflix -> DPI: disable()
DPI --> Netflix:
Netflix -> DPI: flush()
DPI -> DPI: Set audio_switch flag
DPI --> Netflix:
Netflix -> DPI: enable()
DPI --> Netflix:
Netflix -> DPI: firstSampleAvailable()
DPI --> Netflix:
DPI --/ Netflix: getNextMediaSample()
Netflix -> DPI: write(sample)
note right: ISampleWriter detail skipped for clarity
opt audio_switch flag set
DPI -> DPI: clear audio_switch flag
DPI -> GStreamer_client: performAudioTrackCodecChannelSwitch(audioAttr, caps, ...)
note right: This will be a custom Rialto implementation of the API
GStreamer_client -> rialtoClient: removeSourceflush(current_audio_src_id)
rialtoClient -> rialtoServer: removeSourceflush(current_audio_src_id)
rialtoServer -> rialtoServer: For this media source:\n - Stop requesting more data\n - Invalidate pending requests\n - Invalidate cached data in shm for source\n - Disable underflow reporting
rialtoServer -> GStreamer_serverflush
note right: Flush data for removed source
GStreamer_server --> rialtoServer:
rialtoServer -> GStreamer_server: Disable audio flag in playsink
GStreamer_server --> rialtoServer:procedure described in Flush diagram
rialtoServer --> rialtoClient:
rialtoClient --> GStreamer_client:
GStreamer_client -> GStreamer_client: Convert audioAttr & caps to rialto::mediaSource
GStreamer_client -> rialtoClient: attachSourceswitchSource(mediaSource)
rialtoClient -> rialtoServer: attachSourceswitchSource(mediaSource)
opt audio caps changed
rialtoServer -> GStreamerrdk_gstreamer_serverutils: performAudioTrackCodecChannelSwitch(audioAttr, caps, ...)
note right: This will call the underlying _soc\nimplementation for the platform
GStreamerrdk_gstreamer_serverutils --> rialtoServer:
end
rialtoServer -> GStreamer_server: Enable audio flag in playsink
GStreamer_server --> rialtoServer:
rialtoServer -> rialtoServer: For this media source:\n - Start requesting data\n - Enable underflow reporting
rialtoServer --> rialtoClient:
rialtoClient --> GStreamer_client:
GStreamer_client --> DPI:
DPI --> Netflix:
end
@enduml |