Sound Blaster 16: Difference between revisions

m
Bot: Replace deprecated source tag with syntaxhighlight
[unchecked revision][unchecked revision]
m (add commands present on the sb to resume playback of dma sound)
m (Bot: Replace deprecated source tag with syntaxhighlight)
 
(7 intermediate revisions by 6 users not shown)
Line 89:
# Send low bits of position to port 0x02(addr. port of channel 1) For example(see above) is 0x50.
# Send high bits of position to port 0x02(addr. port of channel 1) For example(see above) is 0x04.
# Send low bits of lenghtlength of data to port 0x03(count port of channel 1) For example if is lenghtlength 0x0FFF, send 0xFF
# Send high bits of lenghtlength of data to port 0x03(count port of channel 1) For example if is lenghtlength 0x0FFF, send 0x0F
# Enable channel by writing channel number to port 0x0A
 
Line 100:
# Send low bits of position to port 0xC4(addr. port of channel 5) For example(see above) is 0x50.
# Send high bits of position to port 0xC4(pos. port of channel 5) For example(see above) is 0x04.
# Send low bits of lenghtlength of data to port 0xC6(count port of channel 5) For example if is lenghtlength 0x0FFF, send 0xFF
# Send high bits of lenghtlength of data to port 0xC6(count port of channel 5) For example if is lenghtlength 0x0FFF, send 0x0F
# Enable channel by writing channel number to port 0xD4
 
Line 143:
# Turn speaker on
# Program ISA DMA to transfer
# Set time constant. Notice that the Sound Blaster 16 is able to use sample rates instead of time constants using command 0x41 instead of 0x40. <br> You can calculate the time constant like this: Time constant = 65536 - (256000000 / (channels * sampling rate))
# Set output sample rate
# Write transfer mode to DSP
# Write type of sound data
# Write data lenghtlength to DSP(Low byte/High byte) (You must calculate LENGHTLENGTH-1 e.g. if is your real lenghtlength 0x0FFF, you must send 0xFE and 0x0F)
 
==Code==
<sourcesyntaxhighlight lang="asm">
%macro OUTB 2
mov dx, %1
Line 192:
OUTB 0x22C, 0xC0 ;8 bit sound
OUTB 0x22C, 0x00 ;mono and unsigned sound data
OUTB 0x22C, 0xFE ;COUNT LOW BIT - COUNT LENGHTLENGTH-1 (EXAMPLE 0x0FFF SO 0x0FFE) - SET THIS VALUE FOR YOU
OUTB 0x22C, 0x0F ;COUNT HIGH BIT - COUNT LENGHTLENGTH-1 (EXAMPLE 0x0FFF SO 0x0FFE) - SET THIS VALUE FOR YOU
 
;now transfer start - dontdon't forget to handle irq
</syntaxhighlight>
</source>
 
==QEMU support==
QEMU is one of the few hypervisors/emulators that support this sound card.
To run QEMU with Sound Blaster 16 emulation, use the <code>-soundhw sb16</code> option.
 
'''Warning''': recent versions of QEMU (>= 4.0) have a broken support for
this sound card. See bug: [https://bugs.launchpad.net/qemu/+bug/1873769].
Briefly, when QEMU's GTK UI is used and audio is playing, you'll experience
the QEMU window freezing. In addition, there will be flickering in the audio
as well.
 
===Workarounds===
 
# Use an older version of QEMU. With QEMU 2.11 the problem simply does not exist.
# Use [https://virt-manager.org virt-manager] which connects to QEMU using Spice. The problem does not exist in this case because QEMU's GTK UI is not used. BUT, configuring QEMU to emulate Sound Blaster 16 through virt-manager requires some tricky settings:
## Add any sound card to the VM
## In virt-manager's Edit -> Preferences menu check the "Enable XML editing" box.
## Open VM's hardware and after selecting the sound card, click on the XML tab and replace its contents with:<syntaxhighlight lang="xml"><sound model="sb16"/></syntaxhighlight>
# Run the OS using QEMU's <code>-curses</code> option or use QEMU's <code>-kernel</code> and <code>-nographic</code> (serial console): in this case, there will be no "freeze", but there still be some flickering in the audio.
 
==See Also==