X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dos_sbtest;a=blobdiff_plain;f=src%2Fau_sb.c;fp=src%2Fau_sb.c;h=8ff4ea1d430ae8b257b3461e36a1d181a865b091;hp=ab12b9e405f5d26aeaa9ab485949ee40c2fcf036;hb=85710b37e4082a5b8e6d35c16311cb024298e24f;hpb=6d4de53a835a8258ba05c83a2af38f27a0e92d21 diff --git a/src/au_sb.c b/src/au_sb.c index ab12b9e..8ff4ea1 100644 --- a/src/au_sb.c +++ b/src/au_sb.c @@ -169,18 +169,23 @@ void *sb_buffer(int *size) void sb_start(int rate, int nchan) { + int seg, pmsel; uint32_t addr; int size; _go32_dpmi_seginfo intr; - /* for now just use the are after boot2. it's only used by the second stage - * loader and the VBE init code, none of which should overlap with audio playback. - * It's not necessary to use low memory. We can use up to the first 16mb for this, - * so if this becomes an issue, I'll make a DMA buffer allocator over 1mb. - * start the buffer from the next 64k boundary. - */ - addr = ((uint32_t)low_mem_buffer + 0xffff) & 0xffff0000; - buffer = (void*)addr; + if(!buffer) { + /* allocate a 64k-aligned 64k buffer in low memory */ + if((seg = __dpmi_allocate_dos_memory(65536 * 2 / 16, &pmsel)) <= 0) { + fprintf(stderr, "sb_start: failed to allocate DMA buffer\n"); + return; + } + + addr = ((uint32_t)(seg << 4) + 0xffff) & 0xffff0000; + buffer = (void*)addr; + } else { + addr = (uint32_t)buffer; + } xfer_mode = CMD_MODE_SIGNED; if(nchan > 1) {