Another patch from Jose

git-svn-id: https://svn.musicpd.org/mpd/trunk@5733 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
Avuton Olrich 2007-03-23 21:23:41 +00:00
parent 8553a98c84
commit ef0397bf5b

View File

@ -37,7 +37,7 @@
static char *name = "mpd"; static char *name = "mpd";
static char *output_ports[2]; static char *output_ports[2];
static int ringbuf_sz = 32768; static int ringbuf_sz = 65536;
typedef struct _JackData { typedef struct _JackData {
jack_port_t *ports[2]; jack_port_t *ports[2];
@ -201,7 +201,7 @@ static void set_audioformat(AudioOutput *audioOutput)
audioFormat->channels = 2; audioFormat->channels = 2;
audioFormat->bits = 16; audioFormat->bits = 16;
jd->bps = audioFormat->channels jd->bps = audioFormat->channels
* sizeof(jack_default_audio_sample_t)*8 * sizeof(jack_default_audio_sample_t)
* audioFormat->sampleRate; * audioFormat->sampleRate;
} }
@ -249,7 +249,7 @@ static int jack_initDriver(AudioOutput *audioOutput, ConfigParam *param)
val = strtol(bp->value, &endptr, 10); val = strtol(bp->value, &endptr, 10);
if ( errno == 0 && endptr != bp->value) { if ( errno == 0 && endptr != bp->value) {
ringbuf_sz = val < 32768 ? 32768 : val; ringbuf_sz = val < 65536 ? 65536 : val;
ERROR("ringbuffer_size=%d\n", ringbuf_sz); ERROR("ringbuffer_size=%d\n", ringbuf_sz);
} else { } else {
ERROR("%s is not a number; ringbuf_size=%d\n", ERROR("%s is not a number; ringbuf_size=%d\n",
@ -397,10 +397,10 @@ static int jack_playAudio(AudioOutput * audioOutput, char *buff, int size)
{ {
JackData *jd = audioOutput->data; JackData *jd = audioOutput->data;
size_t space; size_t space;
char *samples1;
char *samples2;
int i; int i;
short *buffer = (short *) buff; short *buffer = (short *) buff;
jack_default_audio_sample_t sample;
size_t samples = size/4;
ERROR("jack_playAudio: (pid=%d)!\n", getpid()); ERROR("jack_playAudio: (pid=%d)!\n", getpid());
@ -411,60 +411,39 @@ static int jack_playAudio(AudioOutput * audioOutput, char *buff, int size)
return 0; return 0;
} }
/*jd->can_process=0;*/
/* if ( jd->our_xrun ) { */
/* ERROR("xrun\n"); */
/* jd->our_xrun = 0; */
/* } */
/*ERROR("jack_playAudio: size=%d\n", size/4);*/ /*ERROR("jack_playAudio: size=%d\n", size/4);*/
/*ERROR("jack_playAudio - INICIO\n");*/ /*ERROR("jack_playAudio - INICIO\n");*/
if ( ! jd->samples1 ) { while ( samples && !jd->shutdown ) {
ERROR("jd->samples1=xmalloc\n"); /*ERROR("\t samples=%d\n", samples);*/
jd->samples1 = (jack_default_audio_sample_t *)
xmalloc(size*sizeof(jack_default_audio_sample_t));
}
if ( ! jd->samples2 ) {
ERROR("jd->samples2=xmalloc\n");
jd->samples2 = (jack_default_audio_sample_t *)
xmalloc(size*sizeof(jack_default_audio_sample_t));
}
/* primero convierto todo el buffer al formato que usa jack */
for (i=0; i<size; i++) {
*(jd->samples1 + i) =
(jack_default_audio_sample_t) *(buffer++) / 32768;
*(jd->samples2 + i) =
(jack_default_audio_sample_t) *(buffer++) / 32768;
/*
*(jd->samples1 + i) =
(jack_default_audio_sample_t) *(buff + i) / 32768;
*(jd->samples2 + i) =
(jack_default_audio_sample_t) *(buff + i) / 32768;
*/
}
samples1 = (char *)jd->samples1;
samples2 = (char *)jd->samples2;
while ( size && !jd->shutdown ) {
if ( (space = jack_ringbuffer_write_space(jd->ringbuffer[0])) if ( (space = jack_ringbuffer_write_space(jd->ringbuffer[0]))
>= size ) { >= samples*sizeof(jack_default_audio_sample_t) ) {
/*ERROR("\t size=%d space=%d\n", size, space);*/ /*ERROR("\t samples_b=%d space=%d\n", samples*sizeof(jack_default_audio_sample_t), space);*/
space = MIN(space, size);
jack_ringbuffer_write(jd->ringbuffer[0],samples1,space); space = MIN(space, samples*sizeof(jack_default_audio_sample_t));
jack_ringbuffer_write(jd->ringbuffer[1],samples2,space);
size -= space; for(i=0; i<space/sizeof(jack_default_audio_sample_t); i++) {
samples1 += space; sample = (jack_default_audio_sample_t) *(buffer++)/32768.0;
samples2 += space;
jack_ringbuffer_write(jd->ringbuffer[0], (void*)&sample,
sizeof(jack_default_audio_sample_t));
sample = (jack_default_audio_sample_t) *(buffer++)/32768.0;
jack_ringbuffer_write(jd->ringbuffer[1], (void*)&sample,
sizeof(jack_default_audio_sample_t));
samples--;
}
} else { } else {
/* ERROR("\t space=%d\n", space); */ /* ERROR("\t space=%d\n", space); */
/* ERROR("\t size=%d\n", size); */ /* ERROR("\t size=%d\n", size); */
usleep((unsigned long) usleep((unsigned long)
((size-space)/jd->bps) * 1000000.0); ((samples*sizeof(jack_default_audio_sample_t)
- space)/jd->bps) * 1000000.0);
} }
} }
/* jd->can_process=1; */
/*ERROR("jack_playAudio - FIN\n");*/ /*ERROR("jack_playAudio - FIN\n");*/