Skip to content

Commit dc72438

Browse files
committed
bfsoundlib: Treat 8-bit WAV files as unsigned
1 parent 785685a commit dc72438

2 files changed

Lines changed: 18 additions & 3 deletions

File tree

bfsoundlib/src/ailwav.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ typedef struct {
4545
int16_t samples_per_block;
4646
} WAVE_FMT;
4747

48+
enum WAVE_FORMAT_TAGS {
49+
WAVE_FORMAT_PCM = 0x0001,
50+
WAVE_FORMAT_IEEE_FLOAT = 0x0003,
51+
WAVE_FORMAT_ALAW = 0x0006,
52+
WAVE_FORMAT_MULAW = 0x0007,
53+
WAVE_FORMAT_EXTENSIBLE = 0xFFFE,
54+
};
55+
4856
/** .WAV file data chunk */
4957
typedef struct {
5058
char DATA_string[4];
@@ -73,7 +81,10 @@ void AIL_process_WAV_image(const uint8_t *image, SNDSAMPLE *s)
7381
f = (WAVE_FMT*)((int8_t*)f + f->chunk_size + 8 + (f->chunk_size & 1));
7482
}
7583

84+
assert(f->format_tag == WAVE_FORMAT_PCM);
85+
7686
// Configure sample type and rate based on FMT chunk
87+
// 8-bit PCM is always unsigned, 16-bit is always signed
7788
if ((f->channels == 1) && (f->bits_per_sample == 8))
7889
{
7990
AIL_set_sample_type(s, DIG_F_MONO_8, 0);

bfsoundlib/src/drv_oal.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,12 +343,18 @@ get_pcm_format(SNDSAMPLE *s)
343343
switch (s->format)
344344
{
345345
case DIG_F_MONO_8:
346+
// OpenAL expects 8-bit formats to be unsigned
347+
assert((s->flags & DIG_PCM_SIGN) == 0);
346348
return AL_FORMAT_MONO8;
347349
case DIG_F_MONO_16:
350+
// OpenAL expects 16-bit formats to be signed
351+
assert((s->flags & DIG_PCM_SIGN) != 0);
348352
return AL_FORMAT_MONO16;
349353
case DIG_F_STEREO_8:
354+
assert((s->flags & DIG_PCM_SIGN) == 0);
350355
return AL_FORMAT_STEREO8;
351356
case DIG_F_STEREO_16:
357+
assert((s->flags & DIG_PCM_SIGN) != 0);
352358
return AL_FORMAT_STEREO16;
353359
case DIG_F_MULTICHANNEL_8:
354360
case DIG_F_MULTICHANNEL_16:
@@ -403,9 +409,7 @@ queue_dig_sample_buffers(DIG_DRIVER *digdrv, SNDSAMPLE *s)
403409
if (len > SOUND_MAX_BUFSIZE)
404410
len = SOUND_MAX_BUFSIZE;
405411

406-
assert ((s->flags & DIG_PCM_SIGN) != 0);
407-
408-
buf = pop_free_buffer ();
412+
buf = pop_free_buffer();
409413
alBufferData(buf, get_pcm_format(s), data, len, s->playback_rate);
410414
if (!check_al("alBufferData"))
411415
goto err;

0 commit comments

Comments
 (0)