Patch title: Release 95 bulk changes
Abstract:
File: /pliant/linux/multimedia/audio.pli
Key:
    Removed line
    Added line
   
module "/pliant/admin/file.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/stream/pipe.pli"
module "/pliant/language/os.pli"
module "/pliant/admin/execute.pli"


method fs open name options flags stream support -> status
  arg_rw AudioFileSystem fs ; arg Str name options ; arg Int
  var Int default_volume := options option "volume" Int
  if default_volume=defined
    (var Stream s) open "file:/dev/mixer"+name in+out+safe
    var Int volume := options option "master_volume" Int def
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_VOLUME add
    var Int volume := options option "pcm_volume" Int defaul
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_PCM addres
    var Int volume := options option "speaker_volume" Int de
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_SPEAKER ad
    var Int volume := options option "line_volume" Int defau
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_LINE addre
    var Int volume := options option "headphone_volume" Int 
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_HEADPHONE 
    var Int volume := options option "mic_volume" Int defaul
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_MIC addres
    s close
  var Link:AudioDriver drv :> new AudioDriver
  if alsa
    var Str dev := options option "device" Str "hw:"+(shunt 
    var Int err := snd_pcm_open drv:pcm dev (shunt (flags .a
    if err<>0
      return (failure "snd_pcm_open error "+string:err)
  else
    status := drv:dsp open (options option "device" Str "dev
    if status=failure
      return (failure "failed to open OSS device "+drv:dsp:n
  drv wav := options option "wav"
  drv wav_offset := 0
  if alsa
    drv garbadge := 0
  if (flags .and. out)<>0 or not drv:wav
    status := drv setup options flags
  else
    status := success
  if status=success
    stream stream_driver :> drv
    var Str format := options option "audio_format" Str
    if (flags .and. out)<>0 and (format="flac" or format="og
      drv wav := format<>"mp3"
      stream_pipe (var Str encoded_in) (var Str encoded_out)
      stream_pipe (var Str wav_in) (var Str wav_out)
      var Link:Stream device :> new Stream
      device open encoded_out out+safe
      stream stream_driver :> device stream_driver
      device stream_driver :> drv
      thread
        if format="flac"
          execute "flac --decode --stdout --silent -" input 
        eif format="ogg"
          execute "oggdec --quiet -o - -" input encoded_in o
        eif format="mp3"
          execute "mpg123 -s -q -" input encoded_in output w
      thread
        (var Stream clear) open wav_in in+safe
module "/pliant/admin/file.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/stream/pipe.pli"
module "/pliant/language/os.pli"
module "/pliant/admin/execute.pli"


method fs open name options flags stream support -> status
  arg_rw AudioFileSystem fs ; arg Str name options ; arg Int
  var Int default_volume := options option "volume" Int
  if default_volume=defined
    (var Stream s) open "file:/dev/mixer"+name in+out+safe
    var Int volume := options option "master_volume" Int def
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_VOLUME add
    var Int volume := options option "pcm_volume" Int defaul
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_PCM addres
    var Int volume := options option "speaker_volume" Int de
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_SPEAKER ad
    var Int volume := options option "line_volume" Int defau
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_LINE addre
    var Int volume := options option "headphone_volume" Int 
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_HEADPHONE 
    var Int volume := options option "mic_volume" Int defaul
    os_ioctl s:stream_handle os_SOUND_MIXER_WRITE_MIC addres
    s close
  var Link:AudioDriver drv :> new AudioDriver
  if alsa
    var Str dev := options option "device" Str "hw:"+(shunt 
    var Int err := snd_pcm_open drv:pcm dev (shunt (flags .a
    if err<>0
      return (failure "snd_pcm_open error "+string:err)
  else
    status := drv:dsp open (options option "device" Str "dev
    if status=failure
      return (failure "failed to open OSS device "+drv:dsp:n
  drv wav := options option "wav"
  drv wav_offset := 0
  if alsa
    drv garbadge := 0
  if (flags .and. out)<>0 or not drv:wav
    status := drv setup options flags
  else
    status := success
  if status=success
    stream stream_driver :> drv
    var Str format := options option "audio_format" Str
    if (flags .and. out)<>0 and (format="flac" or format="og
      drv wav := format<>"mp3"
      stream_pipe (var Str encoded_in) (var Str encoded_out)
      stream_pipe (var Str wav_in) (var Str wav_out)
      var Link:Stream device :> new Stream
      device open encoded_out out+safe
      stream stream_driver :> device stream_driver
      device stream_driver :> drv
      thread
        if format="flac"
          execute "flac --decode --stdout --silent -" input 
        eif format="ogg"
          execute "oggdec --quiet -o - -" input encoded_in o
        eif format="mp3"
          execute "mpg123 -s -q -" input encoded_in output w
      thread
        (var Stream clear) open wav_in in+safe
        while not clear:atend and device=success
          raw_copy clear device 1 2^24
        if false
          clear raw_read addressof:(var WavHeader header) WavHeader:size
          device raw_write addressof:header WavHeader:size
          while not clear:atend and device=success
            clear raw_read addressof:(var Int16 sample) Int16:size
            device raw_write addressof:sample Int16:size
            clear raw_read addressof:(var Int16 sample) Int16:size
            # sample := 0
            device raw_write addressof:sample Int16:size
        else
          while not clear:atend and device=success
            raw_copy clear device 1 2^24
    eif (flags .and. out)<>0 and format="wav"
      drv wav := true
  eif alsa
    snd_pcm_close drv:pcm
  drv time := options option "time" DateTime datetime


    eif (flags .and. out)<>0 and format="wav"
      drv wav := true
  eif alsa
    snd_pcm_close drv:pcm
  drv time := options option "time" DateTime datetime