\chapter{SUNOS ONLY} The modules described in this chapter provide interfaces to features that are unique to the SunOS operating system (versions 4 and 5; the latter is also known as SOLARIS version 2). \section{Built-in module \sectcode{sunaudiodev}} \bimodindex{sunaudiodev} This module allows you to access the sun audio interface. The sun audio hardware is capable of recording and playing back audio data in U-LAW format with a sample rate of 8K per second. A full description can be gotten with \samp{man audio}. The module defines the following variables and functions: \renewcommand{\indexsubitem}{(in module sunaudiodev)} \begin{excdesc}{error} This exception is raised on all errors. The argument is a string describing what went wrong. \end{excdesc} \begin{funcdesc}{open}{mode} This function opens the audio device and returns a sun audio device object. This object can then be used to do I/O on. The \var{mode} parameter is one of \code{'r'} for record-only access, \code{'w'} for play-only access, \code{'rw'} for both and \code{'control'} for access to the control device. Since only one process is allowed to have the recorder or player open at the same time it is a good idea to open the device only for the activity needed. See the audio manpage for details. \end{funcdesc} \subsection{Audio device object methods} The audio device objects are returned by \code{open} define the following methods (except \code{control} objects which only provide getinfo, setinfo and drain): \renewcommand{\indexsubitem}{(audio device method)} \begin{funcdesc}{close}{} This method explicitly closes the device. It is useful in situations where deleting the object does not immediately close it since there are other references to it. A closed device should not be used again. \end{funcdesc} \begin{funcdesc}{drain}{} This method waits until all pending output is processed and then returns. Calling this method is often not necessary: destroying the object will automatically close the audio device and this will do an implicit drain. \end{funcdesc} \begin{funcdesc}{flush}{} This method discards all pending output. It can be used avoid the slow response to a user's stop request (due to buffering of up to one second of sound). \end{funcdesc} \begin{funcdesc}{getinfo}{} This method retrieves status information like input and output volume, etc. and returns it in the form of an audio status object. This object has no methods but it contains a number of attributes describing the current device status. The names and meanings of the attributes are described in \file{/usr/include/sun/audioio.h} and in the audio man page. Member names are slightly different from their C counterparts: a status object is only a single structure. Members of the \code{play} substructure have \samp{o_} prepended to their name and members of the \code{record} structure have \samp{i_}. So, the C member \code{play.sample_rate} is accessed as \code{o_sample_rate}, \code{record.gain} as \code{i_gain} and \code{monitor_gain} plainly as \code{monitor_gain}. \end{funcdesc} \begin{funcdesc}{ibufcount}{} This method returns the number of samples that are buffered on the recording side, i.e. the program will not block on a \code{read} call of so many samples. \end{funcdesc} \begin{funcdesc}{obufcount}{} This method returns the number of samples buffered on the playback side. Unfortunately, this number cannot be used to determine a number of samples that can be written without blocking since the kernel output queue length seems to be variable. \end{funcdesc} \begin{funcdesc}{read}{size} This method reads \var{size} samples from the audio input and returns them as a python string. The function blocks until enough data is available. \end{funcdesc} \begin{funcdesc}{setinfo}{status} This method sets the audio device status parameters. The \var{status} parameter is an device status object as returned by \code{getinfo} and possibly modified by the program. \end{funcdesc} \begin{funcdesc}{write}{samples} Write is passed a python string containing audio samples to be played. If there is enough buffer space free it will immedeately return, otherwise it will block. \end{funcdesc} There is a companion module, \code{SUNAUDIODEV}, which defines useful symbolic constants like \code{MIN_GAIN}, \code{MAX_GAIN}, \code{SPEAKER}, etc. The names of the constants are the same names as used in the C include file \file{}, with the leading string \samp{AUDIO_} stripped. Useability of the control device is limited at the moment, since there is no way to use the 'wait for something to happen' feature the device provides. This is because that feature makes heavy use of signals, and these do not map too well onto Python.