Improved error management

This commit is contained in:
Pierre Pronchery 2014-09-21 22:09:17 +02:00
parent 33947cba4a
commit 0ac65b93c1

View File

@ -128,7 +128,7 @@ static int _event_audio_play_chunk_riff(OSS * oss, FILE * fp, RIFFChunk * rc);
static int _event_audio_play_chunk_wave(OSS * oss, FILE * fp, RIFFChunk * rc); static int _event_audio_play_chunk_wave(OSS * oss, FILE * fp, RIFFChunk * rc);
static int _event_audio_play_open(OSS * oss, char const * device, static int _event_audio_play_open(OSS * oss, char const * device,
WaveFormat * wf); WaveFormat * wf);
static int _event_audio_play_write(RIFFChunk * rc, RIFFChunk * rc2, static int _event_audio_play_write(OSS * oss, RIFFChunk * rc, RIFFChunk * rc2,
FILE * fp, int fd); FILE * fp, int fd);
static int _event_volume_get(OSS * oss, gdouble * level); static int _event_volume_get(OSS * oss, gdouble * level);
static int _event_volume_set(OSS * oss, gdouble level); static int _event_volume_set(OSS * oss, gdouble level);
@ -138,12 +138,17 @@ static int _oss_event(OSS * oss, PhoneEvent * event)
switch(event->type) switch(event->type)
{ {
case PHONE_EVENT_TYPE_AUDIO_PLAY: case PHONE_EVENT_TYPE_AUDIO_PLAY:
return _event_audio_play(oss, /* XXX ignore errors */
event->audio_play.sample); _event_audio_play(oss, event->audio_play.sample);
return 0;
case PHONE_EVENT_TYPE_VOLUME_GET: case PHONE_EVENT_TYPE_VOLUME_GET:
return _event_volume_get(oss, &event->volume_get.level); /* XXX ignore errors */
_event_volume_get(oss, &event->volume_get.level);
return 0;
case PHONE_EVENT_TYPE_VOLUME_SET: case PHONE_EVENT_TYPE_VOLUME_SET:
return _event_volume_set(oss, event->volume_set.level); /* XXX ignore errors */
_event_volume_set(oss, event->volume_set.level);
return 0;
default: /* not relevant */ default: /* not relevant */
break; break;
} }
@ -153,23 +158,29 @@ static int _oss_event(OSS * oss, PhoneEvent * event)
static int _event_audio_play(OSS * oss, char const * sample) static int _event_audio_play(OSS * oss, char const * sample)
{ {
const char path[] = DATADIR "/sounds/" PACKAGE; const char path[] = DATADIR "/sounds/" PACKAGE;
const char ext[] = ".wav";
String * s; String * s;
FILE * fp; FILE * fp;
char buf[128];
/* XXX ignore errors */ if((s = string_new_append(path, "/", sample, ext, NULL)) == NULL)
if((s = string_new_append(path, "/", sample, ".wav", NULL)) == NULL) return -oss->helper->error(NULL, error_get(), 1);
return oss->helper->error(NULL, error_get(), 0);
/* open the audio file */ /* open the audio file */
if((fp = fopen(s, "rb")) == NULL) if((fp = fopen(s, "rb")) == NULL)
{ {
oss->helper->error(NULL, strerror(errno), 0); snprintf(buf, sizeof(buf), "%s: %s", s, strerror(errno));
oss->helper->error(NULL, buf, 1);
string_delete(s); string_delete(s);
return 0; return -1;
} }
string_delete(s); string_delete(s);
/* go through every chunk */ /* go through every chunk */
while(_event_audio_play_chunk(oss, fp) == 0); while(_event_audio_play_chunk(oss, fp) == 0);
fclose(fp); if(fclose(fp) != 0)
{
snprintf(buf, sizeof(buf), "%s: %s", s, strerror(errno));
return -oss->helper->error(NULL, buf, 1);
}
return 0; return 0;
} }
@ -209,9 +220,10 @@ static int _event_audio_play_chunk_riff(OSS * oss, FILE * fp, RIFFChunk * rc)
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif #endif
if(rc->ckSize < sizeof(riffid) if(rc->ckSize < sizeof(riffid))
|| fread(&riffid, sizeof(riffid), 1, fp) != 1)
return -1; return -1;
if(fread(&riffid, sizeof(riffid), 1, fp) != 1)
return -oss->helper->error(NULL, strerror(errno), 1);
rc->ckSize -= sizeof(riffid); rc->ckSize -= sizeof(riffid);
if(strncmp(riffid, wave, sizeof(wave)) == 0) if(strncmp(riffid, wave, sizeof(wave)) == 0)
return _event_audio_play_chunk_wave(oss, fp, rc); return _event_audio_play_chunk_wave(oss, fp, rc);
@ -234,9 +246,10 @@ static int _event_audio_play_chunk_wave(OSS * oss, FILE * fp, RIFFChunk * rc)
while(rc->ckSize > 0) while(rc->ckSize > 0)
{ {
/* read the current WAVE chunk */ /* read the current WAVE chunk */
if(rc->ckSize < sizeof(rc2) if(rc->ckSize < sizeof(rc2))
|| fread(&rc2, sizeof(rc2), 1, fp) != 1)
return -1; return -1;
if(fread(&rc2, sizeof(rc2), 1, fp) != 1)
return -oss->helper->error(NULL, strerror(errno), 1);
#if 0 /* FIXME for big endian */ #if 0 /* FIXME for big endian */
/* FIXME implement */ /* FIXME implement */
#endif #endif
@ -278,7 +291,7 @@ static int _event_audio_play_chunk_wave(OSS * oss, FILE * fp, RIFFChunk * rc)
#endif #endif
if(fd < 0) if(fd < 0)
return -1; return -1;
if(_event_audio_play_write(rc, &rc2, fp, fd) != 0) if(_event_audio_play_write(oss, rc, &rc2, fp, fd) != 0)
break; break;
} }
/* skip the rest of the chunk */ /* skip the rest of the chunk */
@ -307,6 +320,7 @@ static int _event_audio_play_open(OSS * oss, char const * device,
int format; int format;
int channels; int channels;
int samplerate; int samplerate;
char buf[128];
switch(wf->wFormatTag) switch(wf->wFormatTag)
{ {
@ -321,18 +335,22 @@ static int _event_audio_play_open(OSS * oss, char const * device,
channels = wf->wChannels; channels = wf->wChannels;
samplerate = wf->dwSamplesPerSec; samplerate = wf->dwSamplesPerSec;
if((fd = open(device, O_WRONLY)) < 0) if((fd = open(device, O_WRONLY)) < 0)
return -oss->helper->error(NULL, device, 1); {
snprintf(buf, sizeof(buf), "%s: %s", device, strerror(errno));
return -oss->helper->error(NULL, buf, 1);
}
if(ioctl(fd, SNDCTL_DSP_SETFMT, &format) < 0 if(ioctl(fd, SNDCTL_DSP_SETFMT, &format) < 0
|| ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) < 0 || ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) < 0
|| ioctl(fd, SNDCTL_DSP_SPEED, &samplerate) < 0) || ioctl(fd, SNDCTL_DSP_SPEED, &samplerate) < 0)
{ {
close(fd); close(fd);
return -oss->helper->error(NULL, device, 1); snprintf(buf, sizeof(buf), "%s: %s", device, strerror(errno));
return -oss->helper->error(NULL, buf, 1);
} }
return fd; return fd;
} }
static int _event_audio_play_write(RIFFChunk * rc, RIFFChunk * rc2, static int _event_audio_play_write(OSS * oss, RIFFChunk * rc, RIFFChunk * rc2,
FILE * fp, int fd) FILE * fp, int fd)
{ {
uint8_t u8[4096]; uint8_t u8[4096];
@ -344,8 +362,9 @@ static int _event_audio_play_write(RIFFChunk * rc, RIFFChunk * rc2,
{ {
if((s = fread(&u8, sizeof(*u8), s, fp)) == 0) if((s = fread(&u8, sizeof(*u8), s, fp)) == 0)
break; break;
if((ss = write(fd, &u8, s)) < 0 if((ss = write(fd, &u8, s)) < 0)
|| (size_t)ss != s) /* XXX */ return -oss->helper->error(NULL, strerror(errno), 1);
else if((size_t)ss != s) /* XXX */
return -1; return -1;
} }
return 0; return 0;
@ -353,9 +372,8 @@ static int _event_audio_play_write(RIFFChunk * rc, RIFFChunk * rc2,
static int _event_volume_get(OSS * oss, gdouble * level) static int _event_volume_get(OSS * oss, gdouble * level)
{ {
int ret = 0;
int v; int v;
char buf[256]; char buf[128];
if(oss->fd < 0) if(oss->fd < 0)
return 1; return 1;
@ -363,18 +381,17 @@ static int _event_volume_get(OSS * oss, gdouble * level)
{ {
snprintf(buf, sizeof(buf), "%s: %s", "MIXER_READ", strerror( snprintf(buf, sizeof(buf), "%s: %s", "MIXER_READ", strerror(
errno)); errno));
ret |= oss->helper->error(NULL, buf, 0); return -oss->helper->error(NULL, buf, 1);
} }
*level = (((v & 0xff00) >> 8) + (v & 0xff)) / 2; *level = (((v & 0xff00) >> 8) + (v & 0xff)) / 2;
*level /= 100; *level /= 100;
return ret; return 0;
} }
static int _event_volume_set(OSS * oss, gdouble level) static int _event_volume_set(OSS * oss, gdouble level)
{ {
int ret = 0;
int v = level * 100; int v = level * 100;
char buf[256]; char buf[128];
if(oss->fd < 0) if(oss->fd < 0)
return 1; return 1;
@ -383,9 +400,9 @@ static int _event_volume_set(OSS * oss, gdouble level)
{ {
snprintf(buf, sizeof(buf), "%s: %s", "MIXER_WRITE", strerror( snprintf(buf, sizeof(buf), "%s: %s", "MIXER_WRITE", strerror(
errno)); errno));
ret |= oss->helper->error(NULL, buf, 0); return -oss->helper->error(NULL, buf, 1);
} }
return ret; return 0;
} }
@ -393,17 +410,17 @@ static int _event_volume_set(OSS * oss, gdouble level)
static int _oss_open(OSS * oss) static int _oss_open(OSS * oss)
{ {
char const * p; char const * p;
char buf[256]; char buf[128];
if(oss->fd >= 0) if(oss->fd >= 0 && close(oss->fd) != 0)
close(oss->fd); oss->helper->error(NULL, strerror(errno), 1);
if((p = oss->helper->config_get(oss->helper->phone, "oss", "mixer")) if((p = oss->helper->config_get(oss->helper->phone, "oss", "mixer"))
== NULL) == NULL)
p = "/dev/mixer"; p = "/dev/mixer";
if((oss->fd = open(p, O_RDWR)) < 0) if((oss->fd = open(p, O_RDWR)) < 0)
{ {
snprintf(buf, sizeof(buf), "%s: %s", p, strerror(errno)); snprintf(buf, sizeof(buf), "%s: %s", p, strerror(errno));
return oss->helper->error(NULL, buf, 1); return -oss->helper->error(NULL, buf, 1);
} }
return 0; return 0;
} }