123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293(*
* Copyright 2011 The Savonet Team
*
* This file is part of ocaml-mm.
*
* ocaml-mm is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* ocaml-mm is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with ocaml-mm; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* As a special exception to the GNU Library General Public License, you may
* link, statically or dynamically, a "work that uses the Library" with a publicly
* distributed version of the Library to produce an executable file containing
* portions of the Library, and distribute that executable file under terms of
* your choice, without any of the additional requirements listed in clause 6
* of the GNU Library General Public License.
* By "a publicly distributed version of the Library", we mean either the unmodified
* Library as distributed by The Savonet Team, or a modified version of the Library that is
* distributed under the conditions defined in clause 3 of the GNU Library General
* Public License. This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU Library General Public License.
*
*)openMm_baseopenMm_audiomoduleOSS=structexternalset_format:Unix.file_descr->int->int="caml_oss_dsp_setfmt"externalset_channels:Unix.file_descr->int->int="caml_oss_dsp_channels"externalset_rate:Unix.file_descr->int->int="caml_oss_dsp_speed"end(* TODO: other formats than 16 bits? *)classwriter?(device="/dev/dsp")channelssample_rate=object(self)inheritIO.Unix.rw~write:truedeviceinitializerassert(OSS.set_formatfd16=16);assert(OSS.set_channelsfdchannels=channels);assert(OSS.set_ratefdsample_rate=sample_rate)methodprivatestream_really_writebufofslen=letw=ref0inwhile!w<>lendow:=!w+self#stream_writebuf(ofs+!w)(len-!w)donemethodwritebufofslen=lets=Audio.S16LE.makebufofsleninself#stream_really_writes0(String.lengths)methodclose=self#stream_closeendclassreader?(device="/dev/dsp")channelssample_rate=object(self)inheritIO.Unix.rw~read:truedeviceinitializerassert(OSS.set_formatfd16=16);assert(OSS.set_channelsfdchannels=channels);assert(OSS.set_ratefdsample_rate=sample_rate)methodchannels=channelsmethodsample_rate=sample_ratemethodlength:int=assertfalsemethodduration:float=assertfalsemethodreadbufofslen=letslen=Audio.S16LE.lengthchannelsleninlets=Bytes.createsleninletr=self#stream_reads0sleninletlen=Audio.S16LE.lengthchannelsrinAudio.S16LE.to_audio(Bytes.unsafe_to_strings)0bufofslen;lenmethodseek(_:int):unit=assertfalsemethodclose=self#stream_closeend