I'm looking at this bit of code in src/oss.c:
#if __BYTE_ORDER == __LITTLE_ENDIAN
val = AFMT_S16_BE;
val = AFMT_S16_LE;
To my untrained eye, using _BE in a little endian case and _LE in a big endian case seems odd. (Maybe add a comment to the code explaining why it should be that way around?)
The portability issue is the number of underscores in __LITTLE_ENDIAN. In configure.ac, you already have AC_C_BIGENDIAN, so why not test for WORDS_BIGENDIAN like you do in alsa.c instead?