[xmp] Change parameters passed to driver

Signed-off-by: Claudio Matsuoka <cmatsuoka@gmail.com>
master
Claudio Matsuoka 14 years ago
parent d9371fb83b
commit 04b68791b1
  1. 6
      src/common.h
  2. 3
      src/main.c
  3. 7
      src/sound.c
  4. 9
      src/sound.h
  5. 25
      src/sound_alsa.c
  6. 15
      src/sound_bsd.c
  7. 18
      src/sound_coreaudio.c
  8. 2
      src/sound_null.c
  9. 7
      src/sound_oss.c
  10. 12
      src/sound_sndio.c
  11. 11
      src/sound_win32.c

@ -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

@ -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) {

@ -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;
}

@ -3,13 +3,14 @@
#include <xmp.h>
#include <stdio.h>
#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

@ -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;
}

@ -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) {

@ -14,10 +14,6 @@
#include <unistd.h>
#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;

@ -2,7 +2,7 @@
#include <stdlib.h>
#include "sound.h"
static int init(int *sampling_rate, int *format, char **parm)
static int init(struct options *options)
{
return 0;
}

@ -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]",

@ -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;
}

@ -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;

Loading…
Cancel
Save