module Cry:sig..end
Cry implements the protocols used to connect and send source data to
icecast2 and shoutcast servers.
It is a low-level implementation that minimally manages source
connections. In particular, it does not handle synchronisation, unlike
the main implementation libshout. Hence, the task of sending audio data
to the streaming server at real time rate is left to the application.
typeoperation =[ `Both | `Read | `Write ]
type transport = {
|
write : |
|
read : |
|
wait_for : |
|
close : |
val register_ssl : (?bind:string -> host:string -> Unix.sockaddr -> transport) -> unittype error =
| |
Create of |
| |
Connect of |
| |
Close of |
| |
Write of |
| |
Read of |
| |
Busy |
| |
|
| |
Not_connected |
| |
Invalid_usage |
| |
Unknown_host of |
| |
Bad_answer of |
| |
Http_answer of |
exception Error of error
val string_of_error : exn -> stringtype verb =
| |
Put |
| |
Post |
| |
Source |
Sourcetype protocol =
| |
Icy |
| |
Http of |
| |
Https of |
Icy is the (undocumented) shoutcast source protocol.
Http is the icecast2 source protocol.
Https is the icecast2 source protocol with TLS connection.
Ogg streaming is only possible with Http. Any headerless format,
(e.g. mpeg containers), should work with both protocols,
provided you set the correct content-type (mime) for the source.
val string_of_protocol : protocol -> stringtype content_type
val ogg_application : content_typeval ogg_audio : content_typeval ogg_video : content_typeval mpeg : content_typeval content_type_of_string : string -> content_typeval string_of_content_type : content_type -> stringtype mount =
| |
Icy_id of |
| |
Icecast_mount of |
Icy_id are for Shoutcast v2
sid. For Shoutcast v1, use Icy_id 1.type connection = {
|
mount : |
|
user : |
|
password : |
|
host : |
|
port : |
|
chunked : |
|
content_type : |
|
protocol : |
|
headers : |
headers is a hash table containing the headers.
See connection function for more details.
val string_of_connection : connection -> stringtypeaudio_info =(string, string) Hashtbl.t
audio_info function for more details.typemetadata =(string, string) Hashtbl.t
type connection_data = {
|
connection : |
|
transport : |
type status =
| |
Connected of |
| |
Disconnected |
type t
val create : ?bind:string -> ?connection_timeout:float -> ?timeout:float -> unit -> t
bind is not used by default (system default).
timeout is 30. by default.
val get_status : t -> statusval get_icy_cap : t -> boolHttp protocol, this is always true.
For the Icy protocol, this is detected upon connecting.val get_connection_data : t -> connection_data
Raises: Error Not_connected if not connected.
val audio_info : ?samplerate:int ->
?channels:int -> ?quality:float -> ?bitrate:int -> unit -> audio_infoaudio_info value,
filed with given values.val connection : ?user_agent:string ->
?name:string ->
?genre:string ->
?url:string ->
?public:bool ->
?audio_info:audio_info ->
?description:string ->
?host:string ->
?port:int ->
?chunked:bool ->
?password:string ->
?protocol:protocol ->
?user:string ->
mount:mount -> content_type:content_type -> unit -> connectionconnection value
with default values.
mount is mandatory when using the Http protocol.
icy_id is mandatory to support multiple shoutcast sources
on shoutcast v2.
host is "localhost" by default.
password is "hackme" by default.
user is "source" by default. Change user only if you know
what your are doing.
protocol is Http by default.
port is 8000 by default.
chunked is false by default and only works with HTTP/1.1-capable
servers.
The list of preset headers for Http connections is:
"User-Agent", "ice-name", "ice-genre",
"ice-url", "ice-public", "ice-audio-info",
"ice-description".
The list of preset headers for Icy connections is:
"User-Agent", "icy-name", "icy-url", "icy-pub",
"icy-genre", "icy-br".
Additionally, you can also add:
"icy-irc", "icy-icq" and "icy-aim" but these are not added
by this function.
val connect : t -> connection -> unitval update_metadata : ?charset:string -> t -> metadata -> uniticy_cap is true for Icy connections.
For Icy protocol, the relevant metadata are only "song"
and "url".
Raises: Error Not_connected
if not connected.
val manual_update_metadata : host:string ->
port:int ->
protocol:protocol ->
user:string ->
password:string ->
mount:mount ->
?connection_timeout:float ->
?timeout:float ->
?headers:(string, string) Hashtbl.t ->
?bind:string -> ?charset:string -> metadata -> unit
Optional timeout is 30. by default.
Use it only if you know what you are doing !
val send : t -> string -> unit
Raises: Error Not_connected
if not connected.
val close : t -> unit
Raises: Error Not_connected
if not connected.