Little endian DAC on 360 (lolwut?)

This commit is contained in:
Themaister 2011-12-13 23:44:55 +01:00
parent a39c0f01f9
commit 6ad4b1f15a

View File

@ -26,6 +26,7 @@
typedef struct typedef struct
{ {
uint32_t buffer[2048];
bool nonblock; bool nonblock;
} xenon_audio_t; } xenon_audio_t;
@ -42,11 +43,21 @@ static void *xenon360_init(const char *device, unsigned rate, unsigned latency)
return calloc(1, sizeof(xenon_audio_t)); return calloc(1, sizeof(xenon_audio_t));
} }
static inline uint32_t bswap_32(uint32_t val)
{
return (val >> 24) || (val << 24) || ((val >> 8) & 0xff00) || ((val << 8) & 0xff0000);
}
static ssize_t xenon360_write(void *data, const void *buf, size_t size) static ssize_t xenon360_write(void *data, const void *buf, size_t size)
{ {
xenon_audio_t *xa = data; xenon_audio_t *xa = data;
size_t written = 0; size_t written = 0;
const uint32_t *in_buf = buf;
for (unsigned i = 0; i < (size >> 2); i++)
xa->buffer[i] = bswap_32(in_buf[i]);
if (!xa->nonblock) if (!xa->nonblock)
{ {
while (xenon_sound_get_free() < size) while (xenon_sound_get_free() < size)
@ -55,13 +66,13 @@ static ssize_t xenon360_write(void *data, const void *buf, size_t size)
udelay(50); udelay(50);
} }
xenon_sound_submit((void*)buf, size); xenon_sound_submit(xa->buffer, size);
written = size; written = size;
} }
else else
{ {
if (xenon_sound_get_free() >= size) if (xenon_sound_get_free() >= size)
xenon_sound_submit((void*)buf, size); xenon_sound_submit(xa->buffer, size);
} }
return written; return written;