This audio player SDK supports features to affect the audio content being played to the user. The ybrid interaction protocol is based on a connection between server and client to hold states and to control playback.
- winding backward and forward in time
- winding to a specific time
- winding back to live
- skipping items backward and forward, for example skipping back to the latest news, to the next music, ...
- swapping the item to alternative content within the same timeslot
- swapping the service / the channel. Many broadcasters provide more content than the primary radio program does. For example special event channels, party loop channels, different listening perspectives ...
After integrating the framework into your project, use the following lines of Swift code to access ybrid features:
import YbridPlayerSDK
let swr3Endpoint = MediaEndpoint(mediaUri: "http://swr-swr3.cast.ybrid.io/swr/swr3/ybrid").forceProtocol(.ybridV2)
try AudioPlayer.open(for: swr3Endpoint, listener: nil, playbackControl: nil) {
(ybridControl) in /// called asychronously
ybridControl.play()
sleep(2)
ybridControl.skipBackward(ItemType.NEWS)
sleep(10) /// listen to the news
ybridControl.stop()
/// ...
ybridControl.close()
}
sleep(12) /// of course the program must not end here
The signature of AudioPlayer.open
has two callback parameters. The media protocol spoken with the endpoint decides which one is called (asynchronously).
func open(for endpoint:MediaEndpoint, listener: AudioPlayerListener?,
playbackControl: ((PlaybackControl)->())? = nil,
ybridControl: ((YbridControl)->())? = nil )
playbackControl
is called for endpoints using Icecast servers or plain HTTP streaming.PlaybackControl
offers the basic set of actions likeplay()
...ybridControl
is called if, behind the scenes, there is a ybrid server detected. Or if you told the endpoint byendpoint.forceProtocol(.ybridV2)
.
YbridControl
extends PlaybackControl
. It allows the following actions on the audio playing:
public protocol YbridControl : PlaybackControl {
/// time shifting
func wind(by:TimeInterval, _ audioComplete:AudioCompleteCallback?)
func wind(to:Date, _ audioComplete:AudioCompleteCallback?)
func windToLive(_ audioComplete:AudioCompleteCallback?)
func skipForward(_ type:ItemType?, _ audioComplete:AudioCompleteCallback?)
func skipBackward(_ type:ItemType?, _ audioComplete:AudioCompleteCallback?)
/// change content
func swapItem(_ audioComplete:AudioCompleteCallback?)
func swapService(to id:String, _ audioComplete:AudioCompleteCallback?)
/// limit bit rate for content
func maxBitRate(to:Int32)
/// refresh all states, all methods of the YbridControlListener are called
func refresh()
}
public typealias AudioCompleteCallback = ((_ success:Bool) -> ())
If you call an action it'll take a short time until you hear the requested change of audio content. audioComplete
hooks on an action are called when the requested changeover is fullfilled. If success == false
the action won't change anything. Use these callbacks to express the change in the user interface.
Implement YbridControlListener and pass it via the listener parameter of AudioPlayer.open
. You will receive the following notifications on startup and when the value changes
public protocol YbridControlListener : AudioPlayerListener {
func offsetToLiveChanged(_ offset:TimeInterval?)
func swapsChanged(_ swapsLeft:Int)
func servicesChanged(_ services:[Service])
func bitRateChanged(_ maxBitRate:Int32)
}
For a deeper insight into the structure of metadata and the power of Ybrid see Ybrid docs and Ybrid server specs