summaryrefslogtreecommitdiffstats
path: root/apps/plugins/pdbox/PDa/src/s_audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/pdbox/PDa/src/s_audio.c')
-rw-r--r--apps/plugins/pdbox/PDa/src/s_audio.c872
1 files changed, 0 insertions, 872 deletions
diff --git a/apps/plugins/pdbox/PDa/src/s_audio.c b/apps/plugins/pdbox/PDa/src/s_audio.c
index 4cb93307b0..5f27d98671 100644
--- a/apps/plugins/pdbox/PDa/src/s_audio.c
+++ b/apps/plugins/pdbox/PDa/src/s_audio.c
@@ -871,876 +871,4 @@ void glob_foo(void *dummy, t_symbol *s, int argc, t_atom *argv)
}
#endif
}
-/* Copyright (c) 2003, Miller Puckette and others.
-* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
-
-/* machine-independent (well, mostly!) audio layer. Stores and recalls
- audio settings from argparse routine and from dialog window.
-*/
-
-#include "m_pd.h"
-#include "s_stuff.h"
-#include <stdio.h>
-#ifdef UNIX
-#include <unistd.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#define SYS_DEFAULTCH 2
-#define SYS_MAXCH 100
-#define SYS_DEFAULTSRATE 44100
-typedef long t_pa_sample;
-#define SYS_SAMPLEWIDTH sizeof(t_pa_sample)
-#define SYS_BYTESPERCHAN (DEFDACBLKSIZE * SYS_SAMPLEWIDTH)
-#define SYS_XFERSAMPS (SYS_DEFAULTCH*DEFDACBLKSIZE)
-#define SYS_XFERSIZE (SYS_SAMPLEWIDTH * SYS_XFERSAMPS)
-
- /* these are set in this file when opening audio, but then may be reduced,
- even to zero, in the system dependent open_audio routines. */
-int sys_inchannels;
-int sys_outchannels;
-int sys_advance_samples; /* scheduler advance in samples */
-int sys_blocksize = 0; /* audio I/O block size in sample frames */
-int sys_audioapi = API_DEFAULT;
-
-static int sys_meters; /* true if we're metering */
-static float sys_inmax; /* max input amplitude */
-static float sys_outmax; /* max output amplitude */
-
- /* exported variables */
-int sys_schedadvance; /* scheduler advance in microseconds */
-float sys_dacsr;
-
-#ifdef MACOSX
-int sys_hipriority = 1;
-#else
-int sys_hipriority = 0;
-#endif
-
-t_sample *sys_soundout;
-t_sample *sys_soundin;
-
- /* the "state" is normally one if we're open and zero otherwise;
- but if the state is one, we still haven't necessarily opened the
- audio hardware; see audio_isopen() below. */
-static int audio_state;
-
- /* last requested parameters */
-static int audio_naudioindev;
-static int audio_audioindev[MAXAUDIOINDEV];
-static int audio_audiochindev[MAXAUDIOINDEV];
-static int audio_naudiooutdev;
-static int audio_audiooutdev[MAXAUDIOOUTDEV];
-static int audio_audiochoutdev[MAXAUDIOOUTDEV];
-static int audio_rate;
-static int audio_advance;
-
-static int audio_isopen(void)
-{
- return (audio_state &&
- ((audio_naudioindev > 0 && audio_audiochindev[0] > 0)
- || (audio_naudiooutdev > 0 && audio_audiochoutdev[0] > 0)));
-}
-
-static void sys_get_audio_params(
- int *pnaudioindev, int *paudioindev, int *chindev,
- int *pnaudiooutdev, int *paudiooutdev, int *choutdev,
- int *prate, int *padvance)
-{
- int i;
- *pnaudioindev = audio_naudioindev;
- for (i = 0; i < MAXAUDIOINDEV; i++)
- paudioindev[i] = audio_audioindev[i],
- chindev[i] = audio_audiochindev[i];
- *pnaudiooutdev = audio_naudiooutdev;
- for (i = 0; i < MAXAUDIOOUTDEV; i++)
- paudiooutdev[i] = audio_audiooutdev[i],
- choutdev[i] = audio_audiochoutdev[i];
- *prate = audio_rate;
- *padvance = audio_advance;
-}
-
-static void sys_save_audio_params(
- int naudioindev, int *audioindev, int *chindev,
- int naudiooutdev, int *audiooutdev, int *choutdev,
- int rate, int advance)
-{
- int i;
- audio_naudioindev = naudioindev;
- for (i = 0; i < MAXAUDIOINDEV; i++)
- audio_audioindev[i] = audioindev[i],
- audio_audiochindev[i] = chindev[i];
- audio_naudiooutdev = naudiooutdev;
- for (i = 0; i < MAXAUDIOOUTDEV; i++)
- audio_audiooutdev[i] = audiooutdev[i],
- audio_audiochoutdev[i] = choutdev[i];
- audio_rate = rate;
- audio_advance = advance;
-}
-
- /* init routines for any API which needs to set stuff up before
- any other API gets used. This is only true of OSS so far. */
-#ifdef USEAPI_OSS
-void oss_init(void);
-#endif
-
-static void audio_init( void)
-{
- static int initted = 0;
- if (initted)
- return;
- initted = 1;
-#ifdef USEAPI_OSS
- oss_init();
-#endif
-}
-
- /* set channels and sample rate. */
-
-static void sys_setchsr(int chin, int chout, int sr)
-{
- int nblk;
- int inbytes = (chin ? chin : 2) * (DEFDACBLKSIZE*sizeof(float));
- int outbytes = (chout ? chout : 2) * (DEFDACBLKSIZE*sizeof(float));
-
- sys_inchannels = chin;
- sys_outchannels = chout;
- sys_dacsr = sr;
- sys_advance_samples = (sys_schedadvance * sys_dacsr) / (1000000.);
- if (sys_advance_samples < 3 * DEFDACBLKSIZE)
- sys_advance_samples = 3 * DEFDACBLKSIZE;
-
- if (sys_soundin)
- free(sys_soundin);
- sys_soundin = (t_float *)malloc(inbytes);
- memset(sys_soundin, 0, inbytes);
-
- if (sys_soundout)
- free(sys_soundout);
- sys_soundout = (t_float *)malloc(outbytes);
- memset(sys_soundout, 0, outbytes);
-
- if (sys_verbose)
- post("input channels = %d, output channels = %d",
- sys_inchannels, sys_outchannels);
- canvas_resume_dsp(canvas_suspend_dsp());
-}
-
-/* ----------------------- public routines ----------------------- */
-
- /* open audio devices (after cleaning up the specified device and channel
- vectors). The audio devices are "zero based" (i.e. "0" means the first
- one.) We also save the cleaned-up device specification so that we
- can later re-open audio and/or show the settings on a dialog window. */
-
-void sys_open_audio(int naudioindev, int *audioindev, int nchindev,
- int *chindev, int naudiooutdev, int *audiooutdev, int nchoutdev,
- int *choutdev, int rate, int advance, int enable)
-{
- int i, *ip;
- int defaultchannels = SYS_DEFAULTCH;
- int inchans, outchans;
- if (rate < 1)
- rate = SYS_DEFAULTSRATE;
- audio_init();
- /* Since the channel vector might be longer than the
- audio device vector, or vice versa, we fill the shorter one
- in to match the longer one. Also, if both are empty, we fill in
- one device (the default) and two channels. */
- if (naudioindev == -1)
- { /* no input audio devices specified */
- if (nchindev == -1)
- {
- nchindev=1;
- chindev[0] = defaultchannels;
- naudioindev = 1;
- audioindev[0] = DEFAULTAUDIODEV;
- }
- else
- {
- for (i = 0; i < MAXAUDIOINDEV; i++)
- audioindev[i] = i;
- naudioindev = nchindev;
- }
- }
- else
- {
- if (nchindev == -1)
- {
- nchindev = naudioindev;
- for (i = 0; i < naudioindev; i++)
- chindev[i] = defaultchannels;
- }
- else if (nchindev > naudioindev)
- {
- for (i = naudioindev; i < nchindev; i++)
- {
- if (i == 0)
- audioindev[0] = DEFAULTAUDIODEV;
- else audioindev[i] = audioindev[i-1] + 1;
- }
- naudioindev = nchindev;
- }
- else if (nchindev < naudioindev)
- {
- for (i = nchindev; i < naudioindev; i++)
- {
- if (i == 0)
- chindev[0] = defaultchannels;
- else chindev[i] = chindev[i-1];
- }
- naudioindev = nchindev;
- }
- }
-
- if (naudiooutdev == -1)
- { /* not set */
- if (nchoutdev == -1)
- {
- nchoutdev=1;
- choutdev[0]=defaultchannels;
- naudiooutdev=1;
- audiooutdev[0] = DEFAULTAUDIODEV;
- }
- else
- {
- for (i = 0; i < MAXAUDIOOUTDEV; i++)
- audiooutdev[i] = i;
- naudiooutdev = nchoutdev;
- }
- }
- else
- {
- if (nchoutdev == -1)
- {
- nchoutdev = naudiooutdev;
- for (i = 0; i < naudiooutdev; i++)
- choutdev[i] = defaultchannels;
- }
- else if (nchoutdev > naudiooutdev)
- {
- for (i = naudiooutdev; i < nchoutdev; i++)
- {
- if (i == 0)
- audiooutdev[0] = DEFAULTAUDIODEV;
- else audiooutdev[i] = audiooutdev[i-1] + 1;
- }
- naudiooutdev = nchoutdev;
- }
- else if (nchoutdev < naudiooutdev)
- {
- for (i = nchoutdev; i < naudiooutdev; i++)
- {
- if (i == 0)
- choutdev[0] = defaultchannels;
- else choutdev[i] = choutdev[i-1];
- }
- naudiooutdev = nchoutdev;
- }
- }
-
- /* count total number of input and output channels */
- for (i = inchans = 0; i < naudioindev; i++)
- inchans += chindev[i];
- for (i = outchans = 0; i < naudiooutdev; i++)
- outchans += choutdev[i];
- /* if no input or output devices seem to have been specified,
- this really means just disable audio, which we now do. Meanwhile,
- we can set audio input and output devices to their defaults. */
- if (!inchans && !outchans)
- {
- enable = 0;
- naudioindev = nchindev = naudiooutdev = nchoutdev = 1;
- audioindev[0] = audiooutdev[0] = DEFAULTAUDIODEV;
- chindev[0] = choutdev[0] = 0;
- }
- sys_schedadvance = advance * 1000;
- sys_setchsr(inchans, outchans, rate);
- sys_log_error(ERR_NOTHING);
-
- if (enable && (inchans > 0 || outchans > 0))
- {
-#ifdef USEAPI_PORTAUDIO
- if (sys_audioapi == API_PORTAUDIO)
- {
- int blksize = (sys_blocksize ? sys_blocksize : 64);
- pa_open_audio(inchans, outchans, rate, sys_soundin, sys_soundout,
- blksize, sys_advance_samples/blksize,
- (naudiooutdev > 0 ? audioindev[0] : 0),
- (naudiooutdev > 0 ? audiooutdev[0] : 0));
- }
-else
-#endif
-#ifdef USEAPI_JACK
- if (sys_audioapi == API_JACK)
- jack_open_audio((naudioindev > 0 ? chindev[0] : 0),
- (naudiooutdev > 0 ? choutdev[0] : 0), rate);
-
- else
-#endif
-#ifdef USEAPI_OSS
- if (sys_audioapi == API_OSS)
- oss_open_audio(naudioindev, audioindev, nchindev, chindev,
- naudiooutdev, audiooutdev, nchoutdev, choutdev, rate);
- else
-#endif
-#ifdef USEAPI_ALSA
- /* for alsa, only one device is supported; it may
- be open for both input and output. */
- if (sys_audioapi == API_ALSA)
- alsa_open_audio(naudioindev, audioindev, nchindev, chindev,
- naudiooutdev, audiooutdev, nchoutdev, choutdev, rate);
- else
-#endif
-#ifdef USEAPI_MMIO
- if (sys_audioapi == API_MMIO)
- mmio_open_audio(naudioindev, audioindev, nchindev, chindev,
- naudiooutdev, audiooutdev, nchoutdev, choutdev, rate);
- else
-#endif
- post("unknown audio API specified");
- }
- sys_save_audio_params(naudioindev, audioindev, chindev,
- naudiooutdev, audiooutdev, choutdev, rate, advance);
- if (sys_inchannels == 0 && sys_outchannels == 0)
- enable = 0;
- audio_state = enable;
- sys_vgui("set pd_whichapi %d\n", (audio_isopen() ? sys_audioapi : 0));
- sched_set_using_dacs(enable);
-}
-
-void sys_close_audio(void)
-{
- if (!audio_isopen())
- return;
-#ifdef USEAPI_PORTAUDIO
- if (sys_audioapi == API_PORTAUDIO)
- pa_close_audio();
- else
-#endif
-#ifdef USEAPI_JACK
- if (sys_audioapi == API_JACK)
- jack_close_audio();
- else
-#endif
-#ifdef USEAPI_OSS
- if (sys_audioapi == API_OSS)
- oss_close_audio();
- else
-#endif
-#ifdef USEAPI_ALSA
- if (sys_audioapi == API_ALSA)
- alsa_close_audio();
- else
-#endif
-#ifdef USEAPI_MMIO
- if (sys_audioapi == API_MMIO)
- mmio_close_audio();
- else
-#endif
- post("sys_close_audio: unknown API %d", sys_audioapi);
- sys_inchannels = sys_outchannels = 0;
-}
-
- /* open audio using whatever parameters were last used */
-void sys_reopen_audio( void)
-{
- int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
- int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
- int rate, advance;
- sys_get_audio_params(&naudioindev, audioindev, chindev,
- &naudiooutdev, audiooutdev, choutdev, &rate, &advance);
- sys_open_audio(naudioindev, audioindev, naudioindev, chindev,
- naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate, advance, 1);
-}
-
-int sys_send_dacs(void)
-{
- if (sys_meters)
- {
- int i, n;
- float maxsamp;
- for (i = 0, n = sys_inchannels * DEFDACBLKSIZE, maxsamp = sys_inmax;
- i < n; i++)
- {
- float f = sys_soundin[i];
- if (f > maxsamp) maxsamp = f;
- else if (-f > maxsamp) maxsamp = -f;
- }
- sys_inmax = maxsamp;
- for (i = 0, n = sys_outchannels * DEFDACBLKSIZE, maxsamp = sys_outmax;
- i < n; i++)
- {
- float f = sys_soundout[i];
- if (f > maxsamp) maxsamp = f;
- else if (-f > maxsamp) maxsamp = -f;
- }
- sys_outmax = maxsamp;
- }
-
-#ifdef USEAPI_PORTAUDIO
- if (sys_audioapi == API_PORTAUDIO)
- return (pa_send_dacs());
- else
-#endif
-#ifdef USEAPI_JACK
- if (sys_audioapi == API_JACK)
- return (jack_send_dacs());
- else
-#endif
-#ifdef USEAPI_OSS
- if (sys_audioapi == API_OSS)
- return (oss_send_dacs());
- else
-#endif
-#ifdef USEAPI_ALSA
- if (sys_audioapi == API_ALSA)
- return (alsa_send_dacs());
- else
-#endif
-#ifdef USEAPI_MMIO
- if (sys_audioapi == API_MMIO)
- return (mmio_send_dacs());
- else
-#endif
- post("unknown API");
- return (0);
-}
-
-float sys_getsr(void)
-{
- return (sys_dacsr);
-}
-
-int sys_get_outchannels(void)
-{
- return (sys_outchannels);
-}
-
-int sys_get_inchannels(void)
-{
- return (sys_inchannels);
-}
-
-void sys_audiobuf(int n)
-{
- /* set the size, in milliseconds, of the audio FIFO */
- if (n < 5) n = 5;
- else if (n > 5000) n = 5000;
- sys_schedadvance = n * 1000;
-}
-
-void sys_getmeters(float *inmax, float *outmax)
-{
- if (inmax)
- {
- sys_meters = 1;
- *inmax = sys_inmax;
- *outmax = sys_outmax;
- }
- else
- sys_meters = 0;
- sys_inmax = sys_outmax = 0;
-}
-
-void sys_reportidle(void)
-{
-}
-
-#define MAXNDEV 20
-#define DEVDESCSIZE 80
-
-static void audio_getdevs(char *indevlist, int *nindevs,
- char *outdevlist, int *noutdevs, int *canmulti,
- int maxndev, int devdescsize)
-{
- audio_init();
-#ifdef USEAPI_OSS
- if (sys_audioapi == API_OSS)
- {
- oss_getdevs(indevlist, nindevs, outdevlist, noutdevs, canmulti,
- maxndev, devdescsize);
- }
- else
-#endif
-#ifdef USEAPI_ALSA
- if (sys_audioapi == API_ALSA)
- {
- alsa_getdevs(indevlist, nindevs, outdevlist, noutdevs, canmulti,
- maxndev, devdescsize);
- }
- else
-#endif
-#ifdef USEAPI_PORTAUDIO
- if (sys_audioapi == API_PORTAUDIO)
- {
- pa_getdevs(indevlist, nindevs, outdevlist, noutdevs, canmulti,
- maxndev, devdescsize);
- }
- else
-#endif
-#ifdef USEAPI_MMIO
- if (sys_audioapi == API_MMIO)
- {
- mmio_getdevs(indevlist, nindevs, outdevlist, noutdevs, canmulti,
- maxndev, devdescsize);
- }
- else
-#endif
- {
- /* this shouldn't happen once all the above get filled in. */
- int i;
- *nindevs = *noutdevs = 3;
- for (i = 0; i < 3; i++)
- {
- sprintf(indevlist + i * devdescsize, "input device #%d", i+1);
- sprintf(outdevlist + i * devdescsize, "output device #%d", i+1);
- }
- *canmulti = 0;
- }
-}
-
-#ifdef MSW
-#define DEVONSET 0 /* microsoft device list starts at 0 (the "mapper"). */
-#else /* (see also MSW ifdef in sys_parsedevlist(), s_main.c) */
-#define DEVONSET 1 /* To agree with command line flags, normally start at 1 */
-#endif
-
-static void sys_listaudiodevs(void )
-{
- char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
- int nindevs = 0, noutdevs = 0, i, canmulti = 0;
-
- audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
- MAXNDEV, DEVDESCSIZE);
-
- if (!nindevs)
- post("no audio input devices found");
- else
- {
- post("input devices:");
- for (i = 0; i < nindevs; i++)
- post("%d. %s", i+1, indevlist + i * DEVDESCSIZE);
- }
- if (!noutdevs)
- post("no audio output devices found");
- else
- {
- post("output devices:");
- for (i = 0; i < noutdevs; i++)
- post("%d. %s", i + DEVONSET, outdevlist + i * DEVDESCSIZE);
- }
- post("API number %d\n", sys_audioapi);
-}
-
- /* start an audio settings dialog window */
-void glob_audio_properties(t_pd *dummy, t_floatarg flongform)
-{
- char buf[1024 + 2 * MAXNDEV*(DEVDESCSIZE+4)];
- /* these are the devices you're using: */
- int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
- int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
- int audioindev1, audioindev2, audioindev3, audioindev4,
- audioinchan1, audioinchan2, audioinchan3, audioinchan4,
- audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4,
- audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4;
- int rate, advance;
- /* these are all the devices on your system: */
- char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
- int nindevs = 0, noutdevs = 0, canmulti = 0, i;
-
- char indevliststring[MAXNDEV*(DEVDESCSIZE+4)+80],
- outdevliststring[MAXNDEV*(DEVDESCSIZE+4)+80];
-
- audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
- MAXNDEV, DEVDESCSIZE);
-
- strcpy(indevliststring, "{");
- for (i = 0; i < nindevs; i++)
- {
- strcat(indevliststring, "\"");
- strcat(indevliststring, indevlist + i * DEVDESCSIZE);
- strcat(indevliststring, "\" ");
- }
- strcat(indevliststring, "}");
-
- strcpy(outdevliststring, "{");
- for (i = 0; i < noutdevs; i++)
- {
- strcat(outdevliststring, "\"");
- strcat(outdevliststring, outdevlist + i * DEVDESCSIZE);
- strcat(outdevliststring, "\" ");
- }
- strcat(outdevliststring, "}");
-
- sys_get_audio_params(&naudioindev, audioindev, chindev,
- &naudiooutdev, audiooutdev, choutdev, &rate, &advance);
-
- /* post("naudioindev %d naudiooutdev %d longform %f",
- naudioindev, naudiooutdev, flongform); */
- if (naudioindev > 1 || naudiooutdev > 1)
- flongform = 1;
-
-
- audioindev1 = (naudioindev > 0 && audioindev[0]>= 0 ? audioindev[0] : 0);
- audioindev2 = (naudioindev > 1 && audioindev[1]>= 0 ? audioindev[1] : 0);
- audioindev3 = (naudioindev > 2 && audioindev[2]>= 0 ? audioindev[2] : 0);
- audioindev4 = (naudioindev > 3 && audioindev[3]>= 0 ? audioindev[3] : 0);
- audioinchan1 = (naudioindev > 0 ? chindev[0] : 0);
- audioinchan2 = (naudioindev > 1 ? chindev[1] : 0);
- audioinchan3 = (naudioindev > 2 ? chindev[2] : 0);
- audioinchan4 = (naudioindev > 3 ? chindev[3] : 0);
- audiooutdev1 = (naudiooutdev > 0 && audiooutdev[0]>=0 ? audiooutdev[0] : 0);
- audiooutdev2 = (naudiooutdev > 1 && audiooutdev[1]>=0 ? audiooutdev[1] : 0);
- audiooutdev3 = (naudiooutdev > 2 && audiooutdev[2]>=0 ? audiooutdev[2] : 0);
- audiooutdev4 = (naudiooutdev > 3 && audiooutdev[3]>=0 ? audiooutdev[3] : 0);
- audiooutchan1 = (naudiooutdev > 0 ? choutdev[0] : 0);
- audiooutchan2 = (naudiooutdev > 1 ? choutdev[1] : 0);
- audiooutchan3 = (naudiooutdev > 2 ? choutdev[2] : 0);
- audiooutchan4 = (naudiooutdev > 3 ? choutdev[3] : 0);
- sprintf(buf,
-"pdtk_audio_dialog %%s \
-%s %d %d %d %d %d %d %d %d \
-%s %d %d %d %d %d %d %d %d \
-%d %d %d %d\n",
- indevliststring,
- audioindev1, audioindev2, audioindev3, audioindev4,
- audioinchan1, audioinchan2, audioinchan3, audioinchan4,
- outdevliststring,
- audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4,
- audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4,
- rate, advance, canmulti, (flongform != 0));
- gfxstub_deleteforkey(0);
- gfxstub_new(&glob_pdobject, glob_audio_properties, buf);
-}
-
- /* new values from dialog window */
-void glob_audio_dialog(t_pd *dummy, t_symbol *s, int argc, t_atom *argv)
-{
- int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
- int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
- int rate, advance, audioon, i, nindev, noutdev;
- int audioindev1, audioinchan1, audiooutdev1, audiooutchan1;
- int newaudioindev[4], newaudioinchan[4],
- newaudiooutdev[4], newaudiooutchan[4];
- /* the new values the dialog came back with: */
- int newrate = atom_getintarg(16, argc, argv);
- int newadvance = atom_getintarg(17, argc, argv);
- int statewas;
-
- for (i = 0; i < 4; i++)
- {
- newaudioindev[i] = atom_getintarg(i, argc, argv);
- newaudioinchan[i] = atom_getintarg(i+4, argc, argv);
- newaudiooutdev[i] = atom_getintarg(i+8, argc, argv);
- newaudiooutchan[i] = atom_getintarg(i+12, argc, argv);
- }
-
- for (i = 0, nindev = 0; i < 4; i++)
- {
- if (newaudioinchan[i] > 0)
- {
- newaudioindev[nindev] = newaudioindev[i];
- newaudioinchan[nindev] = newaudioinchan[i];
- /* post("in %d %d %d", nindev,
- newaudioindev[nindev] , newaudioinchan[nindev]); */
- nindev++;
- }
- }
- for (i = 0, noutdev = 0; i < 4; i++)
- {
- if (newaudiooutchan[i] > 0)
- {
- newaudiooutdev[noutdev] = newaudiooutdev[i];
- newaudiooutchan[noutdev] = newaudiooutchan[i];
- /* post("out %d %d %d", noutdev,
- newaudiooutdev[noutdev] , newaudioinchan[noutdev]); */
- noutdev++;
- }
- }
-
- sys_close_audio();
- sys_open_audio(nindev, newaudioindev, nindev, newaudioinchan,
- noutdev, newaudiooutdev, noutdev, newaudiooutchan,
- newrate, newadvance, 1);
-}
-
-void sys_listdevs(void )
-{
-#ifdef USEAPI_PORTAUDIO
- if (sys_audioapi == API_PORTAUDIO)
- sys_listaudiodevs();
- else
-#endif
-#ifdef USEAPI_JACK
- if (sys_audioapi == API_JACK)
- jack_listdevs();
- else
-#endif
-#ifdef USEAPI_OSS
- if (sys_audioapi == API_OSS)
- sys_listaudiodevs();
- else
-#endif
-#ifdef USEAPI_MMIO
- if (sys_audioapi == API_MMIO)
- sys_listaudiodevs();
- else
-#endif
-#ifdef USEAPI_ALSA
- if (sys_audioapi == API_ALSA)
- sys_listaudiodevs();
- else
-#endif
- post("unknown API");
-
- sys_listmididevs();
-}
-
-void sys_setblocksize(int n)
-{
- if (n < 1)
- n = 1;
- if (n != (1 << ilog2(n)))
- post("warning: adjusting blocksize to power of 2: %d",
- (n = (1 << ilog2(n))));
- sys_blocksize = n;
-}
-
-void sys_set_audio_api(int which)
-{
- sys_audioapi = which;
- if (sys_verbose)
- post("sys_audioapi %d", sys_audioapi);
-}
-
-void glob_audio_setapi(void *dummy, t_floatarg f)
-{
- int newapi = f;
- if (newapi)
- {
- if (newapi == sys_audioapi)
- {
- if (!audio_isopen())
- sys_reopen_audio();
- }
- else
- {
- sys_close_audio();
- sys_audioapi = newapi;
- /* bash device params back to default */
- audio_naudioindev = audio_naudiooutdev = 1;
- audio_audioindev[0] = audio_audiooutdev[0] = DEFAULTAUDIODEV;
- audio_audiochindev[0] = audio_audiochoutdev[0] = SYS_DEFAULTCH;
- sys_reopen_audio();
- }
- glob_audio_properties(0, 0);
- }
- else if (audio_isopen())
- {
- sys_close_audio();
- audio_state = 0;
- sched_set_using_dacs(0);
- }
-}
- /* start or stop the audio hardware */
-void sys_set_audio_state(int onoff)
-{
- if (onoff) /* start */
- {
- if (!audio_isopen())
- sys_reopen_audio();
- }
- else
- {
- if (audio_isopen())
- {
- sys_close_audio();
- sched_set_using_dacs(0);
- }
- }
- audio_state = onoff;
-}
-
-void sys_get_audio_apis(char *buf)
-{
- int n = 0;
- strcpy(buf, "{ ");
-#ifdef USEAPI_OSS
- sprintf(buf + strlen(buf), "{OSS %d} ", API_OSS); n++;
-#endif
-#ifdef USEAPI_MMIO
- sprintf(buf + strlen(buf), "{\"standard (MMIO)\" %d} ", API_MMIO); n++;
-#endif
-#ifdef USEAPI_ALSA
- sprintf(buf + strlen(buf), "{ALSA %d} ", API_ALSA); n++;
-#endif
-#ifdef USEAPI_PORTAUDIO
-#ifdef MSW
- sprintf(buf + strlen(buf),
- "{\"ASIO (via portaudio)\" %d} ", API_PORTAUDIO);
-#else
-#ifdef OSX
- sprintf(buf + strlen(buf),
- "{\"standard (portaudio)\" %d} ", API_PORTAUDIO);
-#else
- sprintf(buf + strlen(buf), "{portaudio %d} ", API_PORTAUDIO);
-#endif
-#endif
- n++;
-#endif
-#ifdef USEAPI_JACK
- sprintf(buf + strlen(buf), "{jack %d} ", API_JACK); n++;
-#endif
- strcat(buf, "}");
- /* then again, if only one API (or none) we don't offer any choice. */
- if (n < 2)
- strcpy(buf, "{}");
-
-}
-
-#ifdef USEAPI_ALSA
-void alsa_putzeros(int n);
-void alsa_getzeros(int n);
-void alsa_printstate( void);
-#endif
-
- /* debugging */
-void glob_foo(void *dummy, t_symbol *s, int argc, t_atom *argv)
-{
- t_symbol *arg = atom_getsymbolarg(0, argc, argv);
- if (arg == gensym("restart"))
- {
- int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
- int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
- int rate, advance;
- sys_get_audio_params(&naudioindev, audioindev, chindev,
- &naudiooutdev, audiooutdev, choutdev, &rate, &advance);
- sys_close_audio();
- sys_open_audio(naudioindev, audioindev, naudioindev, chindev,
- naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate, advance,
- 1);
- }
-#ifdef USEAPI_ALSA
- else if (arg == gensym("alsawrite"))
- {
- int n = atom_getintarg(1, argc, argv);
- alsa_putzeros(n);
- }
- else if (arg == gensym("alsaread"))
- {
- int n = atom_getintarg(1, argc, argv);
- alsa_getzeros(n);
- }
- else if (arg == gensym("print"))
- {
- alsa_printstate();
- }
-#endif
-}