From 04b68791b1402c8312cf6ad0b9ea3c6be9395b78 Mon Sep 17 00:00:00 2001 From: Claudio Matsuoka Date: Sun, 25 Mar 2012 18:33:39 -0300 Subject: [PATCH] [xmp] Change parameters passed to driver Signed-off-by: Claudio Matsuoka --- src/common.h | 6 +++++- src/main.c | 3 +-- src/sound.c | 7 ++++--- src/sound.h | 9 +++++---- src/sound_alsa.c | 25 +++++++++++++++---------- src/sound_bsd.c | 15 ++++++++------- src/sound_coreaudio.c | 18 +++++++----------- src/sound_null.c | 2 +- src/sound_oss.c | 7 ++++--- src/sound_sndio.c | 12 ++++++------ src/sound_win32.c | 11 ++++++----- 11 files changed, 62 insertions(+), 53 deletions(-) diff --git a/src/common.h b/src/common.h index 24d1890..2966283 100644 --- a/src/common.h +++ b/src/common.h @@ -1,10 +1,12 @@ +#ifndef __COMMON_H +#define __COMMON_H #define MAX_DRV_PARM 10 struct options { int start; /* start order */ int amplify; /* amplification factor */ - int freq; /* sampling rate */ + int rate; /* sampling rate */ int format; /* sample format */ int max_time; /* max. replay time */ int mix; /* channel separation */ @@ -48,3 +50,5 @@ void info_help(void); /* commands */ void read_command(xmp_context, struct control *); + +#endif diff --git a/src/main.c b/src/main.c index fb30468..d38063f 100644 --- a/src/main.c +++ b/src/main.c @@ -166,8 +166,7 @@ int main(int argc, char **argv) if (options.silent) { sound = &sound_null; } else { - sound = select_sound_driver(options.drv_id, &options.freq, - &options.format, options.driver_parm); + sound = select_sound_driver(&options); } if (sound == NULL) { diff --git a/src/sound.c b/src/sound.c index 831c7ff..d4e8b20 100644 --- a/src/sound.c +++ b/src/sound.c @@ -38,16 +38,17 @@ void init_sound_drivers() #endif } -struct sound_driver *select_sound_driver(char *pref, int *rate, int *format, char **parm) +struct sound_driver *select_sound_driver(struct options *options) { struct list_head *head; struct sound_driver *sd; + char *pref = options->drv_id; if (pref) { list_for_each(head, &sound_driver_list) { sd = list_entry(head, struct sound_driver, list); if (strcmp(sd->id, pref) == 0) { - if (sd->init(rate, format, parm) == 0) { + if (sd->init(options) == 0) { return sd; } } @@ -56,7 +57,7 @@ struct sound_driver *select_sound_driver(char *pref, int *rate, int *format, cha list_for_each(head, &sound_driver_list) { sd = list_entry(head, struct sound_driver, list); /* Probing */ - if (sd->init(rate, format, parm) == 0) { + if (sd->init(options) == 0) { /* found */ return sd; } diff --git a/src/sound.h b/src/sound.h index 4f35350..f09fb42 100644 --- a/src/sound.h +++ b/src/sound.h @@ -3,13 +3,14 @@ #include #include +#include "common.h" #include "list.h" struct sound_driver { char *id; char *description; char **help; - int (*init)(int *, int *, char **); + int (*init)(struct options *); void (*deinit)(void); void (*play)(void *, int); void (*flush)(void); @@ -18,8 +19,8 @@ struct sound_driver { struct list_head list; }; -#define parm_init() { char *token; for (; *parm; parm++) { \ - char s[80]; strncpy(s, *parm, 80); \ +#define parm_init(p) { char *token; for (; *(p); (p)++) { \ + char s[80]; strncpy(s, *(p), 80); \ token = strtok(s, ":="); token = strtok(NULL, ""); #define parm_end() } } #define parm_error() do { \ @@ -35,6 +36,6 @@ struct sound_driver { if (2 > sscanf(token, y, z, w)) parm_error(); } } void init_sound_drivers(void); -struct sound_driver *select_sound_driver(char *, int *, int *, char **); +struct sound_driver *select_sound_driver(struct options *); #endif diff --git a/src/sound_alsa.c b/src/sound_alsa.c index 6ebc957..5bf461a 100644 --- a/src/sound_alsa.c +++ b/src/sound_alsa.c @@ -5,16 +5,19 @@ static snd_pcm_t *pcm_handle; -static int init(int *rate, int *format, char **parm) +static int init(struct options *options) { + char **parm = options->driver_parm; snd_pcm_hw_params_t *hwparams; int ret; unsigned int channels, fmt; unsigned int btime = 250000; /* 250ms */ unsigned int ptime = 50000; /* 50ms */ char *card_name = "default"; + unsigned int rate = options->rate; + int format = options->format; - parm_init(); + parm_init(parm); chkparm1("buffer", btime = 1000 * strtoul(token, NULL, 0)); chkparm1("period", btime = 1000 * strtoul(token, NULL, 0)); chkparm1("card", card_name = token); @@ -27,12 +30,12 @@ static int init(int *rate, int *format, char **parm) return -1; } - channels = *format & XMP_FORMAT_MONO ? 1 : 2; - if (*format & XMP_FORMAT_UNSIGNED) { - fmt = *format & XMP_FORMAT_8BIT ? + channels = format & XMP_FORMAT_MONO ? 1 : 2; + if (format & XMP_FORMAT_UNSIGNED) { + fmt = format & XMP_FORMAT_8BIT ? SND_PCM_FORMAT_U8 : SND_PCM_FORMAT_U16; } else { - fmt = *format & XMP_FORMAT_8BIT ? + fmt = format & XMP_FORMAT_8BIT ? SND_PCM_FORMAT_S8 : SND_PCM_FORMAT_S16; } @@ -41,8 +44,7 @@ static int init(int *rate, int *format, char **parm) snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED); snd_pcm_hw_params_set_format(pcm_handle, hwparams, fmt); - snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, - (unsigned int *)rate, 0); + snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, &rate, 0); snd_pcm_hw_params_set_channels_near(pcm_handle, hwparams, &channels); snd_pcm_hw_params_set_buffer_time_near(pcm_handle, hwparams, &btime, 0); snd_pcm_hw_params_set_period_time_near(pcm_handle, hwparams, &ptime, 0); @@ -61,10 +63,13 @@ static int init(int *rate, int *format, char **parm) } if (channels == 1) { - *format |= XMP_FORMAT_MONO; + format |= XMP_FORMAT_MONO; } else { - *format &= ~XMP_FORMAT_MONO; + format &= ~XMP_FORMAT_MONO; } + + options->rate = rate; + options->format = format; return 0; } diff --git a/src/sound_bsd.c b/src/sound_bsd.c index bab5c93..c599a31 100644 --- a/src/sound_bsd.c +++ b/src/sound_bsd.c @@ -19,13 +19,14 @@ static int audio_fd; -static int init(int *rate, int *format, char **parm) +static int init(struct options *options) { + char **parm = options->driver_parm; audio_info_t ainfo; int gain = 128; int bsize = 32 * 1024; - parm_init(); + parm_init(parm); chkparm1("gain", gain = strtoul(token, NULL, 0)); chkparm1("buffer", bsize = strtoul(token, NULL, 0)); parm_end(); @@ -40,19 +41,19 @@ static int init(int *rate, int *format, char **parm) AUDIO_INITINFO(&ainfo); - ainfo.play.sample_rate = *rate; - ainfo.play.channels = *format & XMP_FORMAT_MONO ? 1 : 2; + ainfo.play.sample_rate = options->rate; + ainfo.play.channels = options->format & XMP_FORMAT_MONO ? 1 : 2; ainfo.play.gain = gain; ainfo.play.buffer_size = bsize; - if (*format & XMP_FORMAT_8BIT) { + if (options->format & XMP_FORMAT_8BIT) { ainfo.play.precision = 8; ainfo.play.encoding = AUDIO_ENCODING_ULINEAR; - *format |= XMP_FORMAT_UNSIGNED; + options->format |= XMP_FORMAT_UNSIGNED; } else { ainfo.play.precision = 16; ainfo.play.encoding = AUDIO_ENCODING_SLINEAR; - *format &= ~XMP_FORMAT_UNSIGNED; + options->format &= ~XMP_FORMAT_UNSIGNED; } if (ioctl(audio_fd, AUDIO_SETINFO, &ainfo) == -1) { diff --git a/src/sound_coreaudio.c b/src/sound_coreaudio.c index 138620c..d65cc50 100644 --- a/src/sound_coreaudio.c +++ b/src/sound_coreaudio.c @@ -14,10 +14,6 @@ #include #include "sound.h" - -static int init (struct context_data *ctx); -static void bufdump (struct context_data *, void *, int); -static void shutdown (struct context_data *); static AudioUnit au; /* @@ -123,30 +119,30 @@ OSStatus render_proc(void *inRefCon, */ -static int init(int *sampling_rate, int *format, char **parm) +static int init(struct options *options) { - struct xmp_options *o = &ctx->o; AudioStreamBasicDescription ad; Component comp; ComponentDescription cd; AURenderCallbackStruct rc; OSStatus err; UInt32 size, max_frames; + //char **parm = options->driver_parm; - //parm_init(); + //parm_init(parm); //parm_end(); - ad.mSampleRate = *sampling_rate; + ad.mSampleRate = options->rate; ad.mFormatID = kAudioFormatLinearPCM; ad.mFormatFlags = kAudioFormatFlagIsPacked | kAudioFormatFlagNativeEndian; - if (~*format & XMP_FORMAT_UNSIGNED) { + if (~options->format & XMP_FORMAT_UNSIGNED) { ad.mFormatFlags |= kAudioFormatFlagIsSignedInteger; } - ad.mChannelsPerFrame = *format & XMP_FORMAT_MONO ? 1 : 2; - ad.mBitsPerChannel = *format & XMP_FORMAT_8BIT ? 8 : 16; + ad.mChannelsPerFrame = options->format & XMP_FORMAT_MONO ? 1 : 2; + ad.mBitsPerChannel = options->format & XMP_FORMAT_8BIT ? 8 : 16; ad.mBytesPerFrame = o->resol / 8 * ad.mChannelsPerFrame; ad.mBytesPerPacket = ad.mBytesPerFrame; diff --git a/src/sound_null.c b/src/sound_null.c index 05b1a7a..dc2ad7b 100644 --- a/src/sound_null.c +++ b/src/sound_null.c @@ -2,7 +2,7 @@ #include #include "sound.h" -static int init(int *sampling_rate, int *format, char **parm) +static int init(struct options *options) { return 0; } diff --git a/src/sound_oss.c b/src/sound_oss.c index 553519c..bb61aec 100644 --- a/src/sound_oss.c +++ b/src/sound_oss.c @@ -110,8 +110,9 @@ static void setaudio(int *rate, int *format) } } -static int init(int *rate, int *format, char **parm) +static int init(struct options *options) { + char **parm = options->driver_parm; char *dev_audio[] = { "/dev/dsp", "/dev/sound/dsp" }; audio_buf_info info; static char buf[80]; @@ -120,7 +121,7 @@ static int init(int *rate, int *format, char **parm) fragnum = 16; /* default number of fragments */ i = 1024; /* default size of fragment */ - parm_init(); + parm_init(parm); chkparm2("frag", "%d,%d", &fragnum, &i); chkparm1("dev", dev_audio[0] = token); chkparm0("nosync", do_sync = 0); @@ -136,7 +137,7 @@ static int init(int *rate, int *format, char **parm) if (audio_fd < 0) return -1; - setaudio(rate, format); + setaudio(&options->rate, &options->format); if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info) == 0) { snprintf(buf, 80, "%s [%d fragments of %d bytes]", diff --git a/src/sound_sndio.c b/src/sound_sndio.c index 7567f39..74c9535 100644 --- a/src/sound_sndio.c +++ b/src/sound_sndio.c @@ -22,7 +22,7 @@ static struct sio_hdl *hdl; -static int init(int *rate, int *format, char **parm) +static int init(struct options *options) { struct sio_par par, askpar; @@ -33,19 +33,19 @@ static int init(int *rate, int *format, char **parm) } sio_initpar(&par); - par.pchan = *format & XMP_FORMAT_MONO ? 1 : 2; - par.rate = *rate; + par.pchan = options->format & XMP_FORMAT_MONO ? 1 : 2; + par.rate = options->rate; par.le = SIO_LE_NATIVE; par.appbufsz = par.rate / 4; - if (*format & XMP_FORMAT_8BIT) { + if (options->format & XMP_FORMAT_8BIT) { par.bits = 8; par.sig = 0; - *format |= XMP_FORMAT_UNSIGNED; + options->format |= XMP_FORMAT_UNSIGNED; } else { par.bits = 16; par.sig = 1; - *format &= ~XMP_FORMAT_UNSIGNED; + options->format &= ~XMP_FORMAT_UNSIGNED; } diff --git a/src/sound_win32.c b/src/sound_win32.c index 3509898..c553fd6 100644 --- a/src/sound_win32.c +++ b/src/sound_win32.c @@ -70,15 +70,16 @@ static void CALLBACK wave_callback(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, } } -static int init(int *sampling_rate, int *format, char **parm) +static int init(struct options *options) { + char **parm = options->driver_parm; MMRESULT res; WAVEFORMATEX wfe; int i; num_buffers = 10; - parm_init(); + parm_init(parm); chkparm1("buffers", num_buffers = strtoul(token, NULL, 0)); parm_end(); @@ -89,9 +90,9 @@ static int init(int *sampling_rate, int *format, char **parm) return -1; wfe.wFormatTag = WAVE_FORMAT_PCM; - wfe.wBitsPerSample = *format & XMP_FORMAT_8BIT ? 8 : 16; - wfe.nChannels = *format & XMP_FORMAT_MONO ? 1 : 2; - wfe.nSamplesPerSec = *sampling_rate; + wfe.wBitsPerSample = options->format & XMP_FORMAT_8BIT ? 8 : 16; + wfe.nChannels = options->format & XMP_FORMAT_MONO ? 1 : 2; + wfe.nSamplesPerSec = options->rate; wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nChannels * wfe.wBitsPerSample / 8; wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample / 8;