/* Copyright (C) 2000 Stefan Westerfeld stefan@space.twc.de This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef ARTSC_H #define ARTSC_H #include "artsc_export.h" #ifdef __cplusplus extern "C" { #endif /** * @libdoc aRts plain C API * * The aRts plain C API aims at easily writing/porting plain C apps to the * arts sound server. What is provided is streaming functionality, in a * blocking way. So for most apps, you simply remove the few system calls * that deal with your audio device, and replace them with the appropriate * arts calls. */ /** * the type of streams (simply treat these as black boxes) */ typedef void *arts_stream_t; /* error codes */ #define ARTS_E_NOSERVER ( -1 ) #define ARTS_E_NOBACKEND ( -2 ) #define ARTS_E_NOSTREAM ( -3 ) #define ARTS_E_NOINIT ( -4 ) #define ARTS_E_NOIMPL ( -5 ) /** * the values for stream parameters * * @see arts_parameter_t */ enum arts_parameter_t_enum { ARTS_P_BUFFER_SIZE = 1, ARTS_P_BUFFER_TIME = 2, ARTS_P_BUFFER_SPACE = 3, ARTS_P_SERVER_LATENCY = 4, ARTS_P_TOTAL_LATENCY = 5, ARTS_P_BLOCKING = 6, ARTS_P_PACKET_SIZE = 7, ARTS_P_PACKET_COUNT = 8, ARTS_P_PACKET_SETTINGS = 9 }; /** * parameters for streams * * @li ARTS_P_BUFFER_SIZE (rw) * The size of the internal buffers used for streaming to the server - this * directly affects the latency that will occur. If you never set it * explicitly, this value defaults to at least 65536 (64kb). Generally, * it is important to know that the server itself gives some constraints * which makes buffer sizes below a certain value impossible. So setting * this parameter will always result in either getting what you wanted, * or a larger streaming buffer due to server limitations. * * @li ARTS_P_BUFFER_TIME (rw) * The time the buffer used for streaming to the server takes to play in * milliseconds. This is just a more human readable method to set the buffer * size, so setting ARTS_P_BUFFER_SIZE affects this parameter and the other * way round. As aRts chooses reasonable buffer sizes for streaming (rather * 3*16kb than 40234 bytes), setting this parameter will often end up with * a slightly larger value than you requested. * * @li ARTS_P_BUFFER_SPACE (r) * The amount of bytes that can be read/written without blocking (depending * whether this is a record or play stream). As requesting this parameter * does a few system calls (but no remote invocation) to verify that it is * up-to-date, don't overuse it. * * @li ARTS_P_SERVER_LATENCY (r) * The amount of latency the server creates (due to hardware buffering) * in milliseconds. * * @li ARTS_P_TOTAL_LATENCY (r) * The overall latency in milliseconds it takes (at most), from the time * when you write a byte into a stream, until it gets played on the * soundcard. This is simply a shortcut to the sum of ARTS_P_BUFFER_TIME * and ARTS_P_SERVER_LATENCY. * * @li ARTS_P_BLOCKING (rw) * If this parameter is 1 (the default), arts_read/arts_write will block * when not all data can be read/written successfully, and wait until it * works. If this parameter is 0, arts_read/arts_write will return * the number of successfully read/written bytes immediately. * * @li ARTS_P_PACKET_SIZE (r) * This returns the size of the packets used for buffering. The optimal * size for arts_stream_write is always writing one packet. The buffering of * streams works with audio packets. So the ARTS_P_BUFFER_SIZE parameter of * streams (which specifies how many bytes of a stream are prebuffered), * really consists of (ARTS_P_PACKET_SIZE) * (ARTS_P_PACKET_COUNT). * * @li ARTS_P_PACKET_COUNT (r) * This returns the number of the packets are used for buffering. See * ARTS_P_PACKET_SIZE for more. * * @li ARTS_P_PACKET_SETTINGS (rw) * This is a way to configure packet size & packet count at the same time. * The format is 0xCCCCSSSS, where 2^SSSS is the packet size, and CCCC is * the packet count. Note that when writing this, you don't necessarily * get the settings you requested. */ typedef enum arts_parameter_t_enum arts_parameter_t; /** * initializes the aRts C API, and connects to the sound server * * @return 0 if everything is all right, an error code otherwise */ ARTSC_EXPORT int arts_init(void); /** * disconnects from the sound server and frees the aRts C API internals */ ARTSC_EXPORT void arts_free(void); /** * asks aRtsd to free the DSP device and return 1 if it was successful, * 0 if there were active non-suspendable modules */ ARTSC_EXPORT int arts_suspend(void); /** * asks aRtsd if the DSP device is free and return 1 if it is, * 0 if not */ ARTSC_EXPORT int arts_suspended(void); /** * converts an error code to a human readable error message * * @param errorcode the errorcode (from another arts function that failed) * @returns a text string with the error message */ ARTSC_EXPORT const char *arts_error_text(int errorcode); /** * open a stream for playing * * @param rate the sampling rate (something like 44100) * @param bits how many bits each sample has (8 or 16) * @param channels how many channels, 1 is mono, 2 is stereo * @param name the name of the stream (these will be used so that the user can * assign streams to effects/mixer channels and similar) * * @return a stream */ ARTSC_EXPORT arts_stream_t arts_play_stream(int rate, int bits, int channels, const char *name); /** * open a stream for recording * * @param rate the sampling rate (something like 44100) * @param bits how many bits each sample has (8 or 16) * @param channels how many channels, 1 is mono, 2 is stereo * @param name the name of the stream (these will be used so that the user can * assign streams to effects/mixer channels and similar) * * @return a stream */ ARTSC_EXPORT arts_stream_t arts_record_stream(int rate, int bits, int channels, const char *name); /** * close a stream */ ARTSC_EXPORT void arts_close_stream(arts_stream_t stream); /** * read samples from stream * * @param stream a previously opened record stream * @param buffer a buffer with sample data * @param count the number of bytes contained in the buffer * * @returns number of read bytes on success or error code */ ARTSC_EXPORT int arts_read(arts_stream_t stream, void *buffer, int count); /** * write samples to to stream * * @param stream a previously opened play stream * @param buffer a buffer with sample data * @param count the number of bytes contained in the buffer * * @returns number of written bytes on success or error code */ ARTSC_EXPORT int arts_write(arts_stream_t stream, const void *buffer, int count); /** * configure a parameter of a stream * * @param stream an opened record or play stream * @param parameter the parameter you want to modify * @param value the new value * * @returns the new value of the parameter (which may or may not be the value * you wanted to have), or an error code if something went wrong */ ARTSC_EXPORT int arts_stream_set(arts_stream_t stream, arts_parameter_t param, int value); /** * query a parameter of a stream * * @param stream an opened record or play stream * @param parameter the parameter you want to query * * @returns the value of the parameter, or an error code */ ARTSC_EXPORT int arts_stream_get(arts_stream_t stream, arts_parameter_t param); #ifdef __cplusplus } #endif #endif /* ARTSC_H */