AUDIO Patch for FLAC and Ogg Opus support

Here you can discuss the development of patches.

AUDIO Patch for FLAC and Ogg Opus support

Postby krcroft » 2018-9-02 @ 05:34

Builds upon DOSBox SVN & SDL2 by NY00123 by replacing DOSBox's CD Audio File backend from SDL_Sound to the actively maintained SDL Mixer-X, which provides:

  • FLAC support for archival and bit-exact playback, including SACD tracks at 24-bit depth and >44.1 KHz sample rates
  • Ogg Opus support, which (since 2012) replaced Ogg Vorbis and Speex as Xiph's recommended format. Opus provides best-in-class quality versus Vorbis, AAC, and MP3 at equal bitrates
  • Ogg Vorbis is now efficiently decoded using frame-sized chunks instead of repeated tiny reads in SDL_Sound
The goal of this work is to see these features and fixes (not necessary the code), in some form, integrated into the mainline of DOSBox such that all users can benefit from FLAC and Ogg Opus audio-track handling.
FLAC and Opus are the "big two" codecs (lossless and lossy), and the golden-era of gaming deserves no-less when it comes to storage and playback.

Highlighted diff: sdl2_r4157...master

Repo and Build Procedure: https://gitlab.com/krcroft/dosbox_sdl2_mixer_x

Comments, improvements, and merge requests welcome!

(PS - I tried posting this in DOSBox Patches, however I don't have the option to create a new post in that forum)
Last edited by krcroft on 2018-9-13 @ 04:15, edited 1 time in total.
krcroft
Newbie
 
Posts: 58
Joined: 2017-4-29 @ 15:07
Location: Tsawwassen

Re: AUDIO Patch for FLAC and Ogg Opus support (SDL2)

Postby Qbix » 2018-9-06 @ 12:20

would there be an easy way to remove all formatting changes that you did ? (familiar with git commits/patches)
As those don't belong in this patch.

I have to test the frame sized decoding, as the current ogg decoding can give a lot of stuttering I noticed..
Water flows down the stream
How to ask questions the smart way!
User avatar
Qbix
DOSBox Author
 
Posts: 10630
Joined: 2002-11-27 @ 14:50
Location: Fryslan

Re: AUDIO Patch for FLAC and Ogg Opus support (SDL2)

Postby krcroft » 2018-9-06 @ 13:51

Qbix wrote:would there be an easy way to remove all formatting changes that you did ? (familiar with git commits/patches)
As those don't belong in this patch.

I have to test the frame sized decoding, as the current ogg decoding can give a lot of stuttering I noticed..


Yes, I will tidy up the diff today!
krcroft
Newbie
 
Posts: 58
Joined: 2017-4-29 @ 15:07
Location: Tsawwassen

Re: AUDIO Patch for FLAC and Ogg Opus support (SDL2)

Postby krcroft » 2018-9-08 @ 22:45

Qbix,

Here's a non-SDL2, non-SDL_Mixer-X patch that focuses just on the core cdrom_image.cpp changes, so you can test on your side:
  • 16KB circular buffer used to feed the callbacks
  • 4KB chunked reads from SDL_Sound (recommended by the vorbis project)
  • SDL audio locking and unlocking has been eliminated
  • SDL_Sound's buffer-size is now set once and never resized (to avoid repeated re-malloc'ing in the library)
  • Only one seek is performed per-playback sequence; all remaining calls to SDL sound are sequential decodes (similar to a physical CDROM)
  • The DOSBox mixer channel is now only active during playback sequences, and is no longer left active and fed with silence (to reduce call overhead and audio latency in the mixer)

Highlighted diff is here: https://gitlab.com/krcroft/dosbox_audio ... expanded=1

Attached is a patch that applies to r4160.
You do not have the required permissions to view the files attached to this post.
Last edited by krcroft on 2018-9-08 @ 22:56, edited 2 times in total.
krcroft
Newbie
 
Posts: 58
Joined: 2017-4-29 @ 15:07
Location: Tsawwassen

Re: AUDIO Patch for FLAC and Ogg Opus support (SDL2)

Postby krcroft » 2018-9-08 @ 22:54

If you comment-in the three 'printStatus' calls in the callback, it will show the behavior of the buffer.

If the 16KB circular buffer doesn't have enough data to satisfy the callback, it attempts to fill itself using chunked-reads from SDL_Sound.

We see four of these reads initially here, followed by lots tiny callbacks that slowly deplete the buffer.

Code: Select all
 25% [|||||||||||||||                                             ] - fill
 50% [||||||||||||||||||||||||||||||                              ] - fill
 74% [||||||||||||||||||||||||||||||||||||||||||||                ] - fill
 99% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ] - fill
 98% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ] - consume
 97% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  ] - consume
 96% [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||   ] - consume
 95% [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||   ] - consume
 94% [||||||||||||||||||||||||||||||||||||||||||||||||||||||||    ] - consume
 93% [|||||||||||||||||||||||||||||||||||||||||||||||||||||||     ] - consume
 92% [|||||||||||||||||||||||||||||||||||||||||||||||||||||||     ] - consume
 91% [||||||||||||||||||||||||||||||||||||||||||||||||||||||      ] - consume
 90% [||||||||||||||||||||||||||||||||||||||||||||||||||||||      ] - consume
 89% [|||||||||||||||||||||||||||||||||||||||||||||||||||||       ] - consume
 87% [||||||||||||||||||||||||||||||||||||||||||||||||||||        ] - consume
 86% [||||||||||||||||||||||||||||||||||||||||||||||||||||        ] - consume
 85% [|||||||||||||||||||||||||||||||||||||||||||||||||||         ] - consume
 84% [||||||||||||||||||||||||||||||||||||||||||||||||||          ] - consume
 83% [||||||||||||||||||||||||||||||||||||||||||||||||||          ] - consume
 82% [|||||||||||||||||||||||||||||||||||||||||||||||||           ] - consume
 81% [||||||||||||||||||||||||||||||||||||||||||||||||            ] - consume
 80% [||||||||||||||||||||||||||||||||||||||||||||||||            ] - consume
 79% [|||||||||||||||||||||||||||||||||||||||||||||||             ] - consume
 78% [|||||||||||||||||||||||||||||||||||||||||||||||             ] - consume
 77% [||||||||||||||||||||||||||||||||||||||||||||||              ] - consume
 76% [|||||||||||||||||||||||||||||||||||||||||||||               ] - consume
 75% [|||||||||||||||||||||||||||||||||||||||||||||               ] - consume
 74% [||||||||||||||||||||||||||||||||||||||||||||                ] - consume
 73% [|||||||||||||||||||||||||||||||||||||||||||                 ] - consume
 71% [|||||||||||||||||||||||||||||||||||||||||||                 ] - consume
 70% [||||||||||||||||||||||||||||||||||||||||||                  ] - consume
 69% [|||||||||||||||||||||||||||||||||||||||||                   ] - consume
 68% [|||||||||||||||||||||||||||||||||||||||||                   ] - consume
 67% [||||||||||||||||||||||||||||||||||||||||                    ] - consume
 66% [|||||||||||||||||||||||||||||||||||||||                     ] - consume
 65% [|||||||||||||||||||||||||||||||||||||||                     ] - consume
 64% [||||||||||||||||||||||||||||||||||||||                      ] - consume
 63% [||||||||||||||||||||||||||||||||||||||                      ] - consume
 62% [|||||||||||||||||||||||||||||||||||||                       ] - consume
 61% [||||||||||||||||||||||||||||||||||||                        ] - consume
 60% [||||||||||||||||||||||||||||||||||||                        ] - consume
 59% [|||||||||||||||||||||||||||||||||||                         ] - consume
 58% [||||||||||||||||||||||||||||||||||                          ] - consume
 56% [||||||||||||||||||||||||||||||||||                          ] - consume
 55% [|||||||||||||||||||||||||||||||||                           ] - consume
 54% [||||||||||||||||||||||||||||||||                            ] - consume
 53% [||||||||||||||||||||||||||||||||                            ] - consume
 52% [|||||||||||||||||||||||||||||||                             ] - consume
 51% [||||||||||||||||||||||||||||||                              ] - consume
 50% [||||||||||||||||||||||||||||||                              ] - consume
 49% [|||||||||||||||||||||||||||||                               ] - consume
 48% [|||||||||||||||||||||||||||||                               ] - consume
 47% [||||||||||||||||||||||||||||                                ] - consume
 46% [|||||||||||||||||||||||||||                                 ] - consume
 45% [|||||||||||||||||||||||||||                                 ] - consume
 44% [||||||||||||||||||||||||||                                  ] - consume
 42% [|||||||||||||||||||||||||                                   ] - consume
 41% [|||||||||||||||||||||||||                                   ] - consume
 40% [||||||||||||||||||||||||                                    ] - consume
 39% [|||||||||||||||||||||||                                     ] - consume
 38% [|||||||||||||||||||||||                                     ] - consume
 37% [||||||||||||||||||||||                                      ] - consume
 36% [|||||||||||||||||||||                                       ] - consume
 35% [|||||||||||||||||||||                                       ] - consume
 34% [||||||||||||||||||||                                        ] - consume
 33% [|||||||||||||||||||                                         ] - consume
 32% [|||||||||||||||||||                                         ] - consume
 31% [||||||||||||||||||                                          ] - consume
 30% [||||||||||||||||||                                          ] - consume
 28% [|||||||||||||||||                                           ] - consume
 27% [||||||||||||||||                                            ] - consume
 26% [||||||||||||||||                                            ] - consume
 25% [|||||||||||||||                                             ] - consume
 24% [||||||||||||||                                              ] - consume
 23% [||||||||||||||                                              ] - consume
 22% [|||||||||||||                                               ] - consume
 21% [||||||||||||                                                ] - consume
 20% [||||||||||||                                                ] - consume
 19% [|||||||||||                                                 ] - consume
 18% [||||||||||                                                  ] - consume
 17% [||||||||||                                                  ] - consume
 16% [|||||||||                                                   ] - consume
 15% [|||||||||                                                   ] - consume
 14% [||||||||                                                    ] - consume
 12% [|||||||                                                     ] - consume
 11% [|||||||                                                     ] - consume
 10% [||||||                                                      ] - consume
  9% [|||||                                                       ] - consume
  8% [|||||                                                       ] - consume
  7% [||||                                                        ] - consume
  6% [|||                                                         ] - consume
  5% [|||                                                         ] - consume
  4% [||                                                          ] - consume
  3% [||                                                          ] - consume
  2% [|                                                           ] - consume
  1% [                                                            ] - consume
  0% [                                                            ] - consume
  0% [                                                            ] - wrap
 24% [||||||||||||||                                              ] - fill
 49% [|||||||||||||||||||||||||||||                               ] - fill
 48% [|||||||||||||||||||||||||||||                               ] - consume
 47% [||||||||||||||||||||||||||||                                ] - consume
 46% [|||||||||||||||||||||||||||                                 ] - consume
 45% [|||||||||||||||||||||||||||                                 ] - consume
 44% [||||||||||||||||||||||||||                                  ] - consume
 43% [||||||||||||||||||||||||||                                  ] - consume
 42% [|||||||||||||||||||||||||                                   ] - consume
 41% [||||||||||||||||||||||||                                    ] - consume
 40% [||||||||||||||||||||||||                                    ] - consume
 39% [|||||||||||||||||||||||                                     ] - consume
 38% [||||||||||||||||||||||                                      ] - consume
 36% [||||||||||||||||||||||                                      ] - consume
 35% [|||||||||||||||||||||                                       ] - consume
 34% [||||||||||||||||||||                                        ] - consume
 33% [||||||||||||||||||||                                        ] - consume
 32% [|||||||||||||||||||                                         ] - consume
 31% [||||||||||||||||||                                          ] - consume
 30% [||||||||||||||||||                                          ] - consume
 29% [|||||||||||||||||                                           ] - consume
 28% [|||||||||||||||||                                           ] - consume
 27% [||||||||||||||||                                            ] - consume
 26% [|||||||||||||||                                             ] - consume
 25% [|||||||||||||||                                             ] - consume
 24% [||||||||||||||                                              ] - consume
 23% [|||||||||||||                                               ] - consume
 21% [|||||||||||||                                               ] - consume
 20% [||||||||||||                                                ] - consume
 19% [|||||||||||                                                 ] - consume
 18% [|||||||||||                                                 ] - consume
 18% [||||||||||                                                  ] - consume
 18% [||||||||||                                                  ] - stop
StopAudio -- CDROM audio channel disabled
CDROM audio channel freed


During that second round of fills (which only partially filled the buffer), it only needed two chunks to satisfy the remaining playback duration.
krcroft
Newbie
 
Posts: 58
Joined: 2017-4-29 @ 15:07
Location: Tsawwassen

Re: AUDIO Patch for FLAC and Ogg Opus support

Postby krcroft » 2018-9-13 @ 04:41

Windows binaries attached, including latest version of the audio encoders:
- DOSBox r4160 (latest) with ability to play FLAC and Opus audio tracks (in addition to improved Vorbis decoding) from BIN/CUE files.
- FLAC 1.3.2 encoder
- Opus 1.3-rc and encoding tools 0.1.10-2
- Vorbis 1.3.6 + aoTuV b6.03 + Lancer encoder

in your CUE files, you can now include opus and flac files, with the following example format:

Code: Select all
FILE "data.iso" BINARY
  TRACK 01 MODE1/2048
    INDEX 01 00:00:00

FILE "audio02.ogg" OGG
  TRACK 02 AUDIO
    PREGAP 00:02:00
    INDEX 01 00:00:00

FILE "track03.opus" OPUS
  TRACK 03 AUDIO
    PREGAP 00:02:00
    INDEX 01 00:00:00

FILE "track04.flac" FLAC
  TRACK 04 AUDIO
    PREGAP 00:02:00
    INDEX 01 00:00:00


Attached are the two patches used to create this:
- dosbox-r4160-audio_updates.patch
- sdl_sound-1.0.3-opus_flac_stb_vorbis.patch

The DOSBox patch applies to r4160 (-p1), and includes:
- Lock-free chunked reads from SDL_Audio
- Direct pass-through of the audio-track's channels and sampling rate to the mixer
This allows for interpolation-free playback if your files match your mixer sampling rate.
The channel is adjusted at playback, so it's fine to have a cue sheet with mono and stereo files, as well as different sampling rates.
- Fix for the double-loading of CD image's

The SDL_Sound patch applies to SDL_Sound-1.0.3 (-p1), and includes:
- Ogg Opus decoder routines (new)
- Improved Dr.FLAC decoder routines (ported from upstream)
- Improved STB Vorbis decoder routines (ported from upstream)

Meanwhile, SDL_Sound upstream is being renovated (SDL2.0 exclusive, autotools ripped out and replaced w/ cmake, decoders are being replaced and deprecated).

Changelog:
- rev2: fixed raw BIN audio playback (which doesn't involve audio files).
You do not have the required permissions to view the files attached to this post.
Last edited by krcroft on 2018-9-14 @ 04:03, edited 3 times in total.
krcroft
Newbie
 
Posts: 58
Joined: 2017-4-29 @ 15:07
Location: Tsawwassen

Re: AUDIO Patch for FLAC and Ogg Opus support

Postby Qbix » 2018-9-13 @ 06:55

let me move it to the patches forum.
I have to check the changes in more detail when I finally find that dynrec bug that has been haunting me.
Water flows down the stream
How to ask questions the smart way!
User avatar
Qbix
DOSBox Author
 
Posts: 10630
Joined: 2002-11-27 @ 14:50
Location: Fryslan

Re: AUDIO Patch for FLAC and Ogg Opus support

Postby krcroft » 2018-9-14 @ 04:00

Qbix wrote:let me move it to the patches forum.
I have to check the changes in more detail when I finally find that dynrec bug that has been haunting me.

Qbix, please disregard that first DOSBox patch; it broken BIN-audio playback (not involving audio files).
I've attached "dosbox-r4160-audio_updates-rev2.patch" above which corrects it using TrackFile polymorphism.
All of the improvements made in on the AudioFile playback side now similarly apply when playing audio from a BinaryFile.
You do not have the required permissions to view the files attached to this post.
krcroft
Newbie
 
Posts: 58
Joined: 2017-4-29 @ 15:07
Location: Tsawwassen


Return to DOSBox Patches

Who is online

Users browsing this forum: No registered users and 0 guests