sig
  type handle
  type params
  type stream = Playback | Capture
  type mode = Async | Non_blocking
  val open_pcm :
    string -> Alsa.Pcm.stream list -> Alsa.Pcm.mode list -> Alsa.Pcm.handle
  val close : Alsa.Pcm.handle -> unit
  val prepare : Alsa.Pcm.handle -> unit
  val resume : Alsa.Pcm.handle -> unit
  val recover : ?verbose:bool -> Alsa.Pcm.handle -> exn -> unit
  val start : Alsa.Pcm.handle -> unit
  val drain : Alsa.Pcm.handle -> unit
  val drop : Alsa.Pcm.handle -> unit
  val pause : Alsa.Pcm.handle -> bool -> unit
  val reset : Alsa.Pcm.handle -> unit
  val wait : Alsa.Pcm.handle -> int -> bool
  val readi : Alsa.Pcm.handle -> string -> int -> int -> int
  val writei : Alsa.Pcm.handle -> string -> int -> int -> int
  val readn : Alsa.Pcm.handle -> string array -> int -> int -> int
  val writen : Alsa.Pcm.handle -> string array -> int -> int -> int
  val readn_float : Alsa.Pcm.handle -> float array array -> int -> int -> int
  val writen_float :
    Alsa.Pcm.handle -> float array array -> int -> int -> int
  val readn_float64 :
    Alsa.Pcm.handle -> float array array -> int -> int -> int
  val writen_float64 :
    Alsa.Pcm.handle -> float array array -> int -> int -> int
  val get_delay : Alsa.Pcm.handle -> int
  type state =
      St_open
    | St_setup
    | St_prepared
    | St_running
    | St_xrun
    | St_draining
    | St_paused
    | St_suspended
    | St_disconnected
  val get_state : Alsa.Pcm.handle -> Alsa.Pcm.state
  val get_params : Alsa.Pcm.handle -> Alsa.Pcm.params
  val set_params : Alsa.Pcm.handle -> Alsa.Pcm.params -> unit
  type access = Access_rw_interleaved | Access_rw_noninterleaved
  val set_access :
    Alsa.Pcm.handle -> Alsa.Pcm.params -> Alsa.Pcm.access -> unit
  type fmt = Format_s16_le | Format_s24_3le | Format_float | Format_float64
  val set_format : Alsa.Pcm.handle -> Alsa.Pcm.params -> Alsa.Pcm.fmt -> unit
  val set_rate_near :
    Alsa.Pcm.handle -> Alsa.Pcm.params -> int -> Alsa.direction -> int
  val set_channels : Alsa.Pcm.handle -> Alsa.Pcm.params -> int -> unit
  val set_periods :
    Alsa.Pcm.handle -> Alsa.Pcm.params -> int -> Alsa.direction -> unit
  val get_periods_min : Alsa.Pcm.params -> int * Alsa.direction
  val get_periods_max : Alsa.Pcm.params -> int * Alsa.direction
  val set_buffer_size : Alsa.Pcm.handle -> Alsa.Pcm.params -> int -> unit
  val set_buffer_size_near : Alsa.Pcm.handle -> Alsa.Pcm.params -> int -> int
  val get_buffer_size_min : Alsa.Pcm.params -> int
  val get_buffer_size_max : Alsa.Pcm.params -> int
  val set_nonblock : Alsa.Pcm.handle -> bool -> unit
  val get_frame_size : Alsa.Pcm.params -> int
end