[video output=day524 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Integrating WAV Importing" vod_platform=youtube id=mXqA2U0sa28 annotator=Miblo]
[0:01][Welcome with a plug of Handmade Seattle[ref
    site="Handmade Seattle"
    url=https://www.handmade-seattle.com/], noting that the HandmadeCon site[ref
        site="Handmade Hero"
        page="Handmade Hero-related Conferences"
        url=https://handmadehero.org/conference] now mentions this conference][:research]
[6:09][Recap and set the stage for the day merging in our WAV processing code][:"asset system" :parsing :speech]
[7:33][Navigate handmade_wav.cpp, eliciting a green flash in ~4coder – denoting a render buffer overflow – at 7\:43][:admin]
[7:46][Request a note of the green flash from @Miblo][:admin]
[8:44][@Miblo][Q: Gotcha! I'll email you the link to it]
[8:50][Set up to implement ParseWAV()][:"asset system" :parsing :research]
[11:29][Replace the assertions in ParseWAV() with :"error handling"][:"asset system" :parsing]
[20:08][Consider enabling ParseWAV() to support an arbitrary number of audio channels][:"asset system" :research]
[26:55][Consider enabling ParseWAV() to deinterleave audio sources, for mixing down to 8 channels][:"asset system" :parsing :research]
[29:00][Enable ParseWAV() to deinterleave audio sources into separate buffers, introducing GetChannelSamples()][:"asset system" :parsing]
[35:46][Remove the stale code from ParseWAV()][:"asset system" :parsing]
[36:54][Iterating over RIFF chunks][:"asset system" :"file format" :parsing :research]
[38:47][Create handmade_riff.cpp to contain our existing RIFF iteration code[ref
    site=Wikipedia
    page="Resource Interchange File Format"
    url=https://en.wikipedia.org/wiki/Resource_Interchange_File_Format][ref
        author="IBM Corporation and Microsoft Corporation"
        title="Multimedia Programming Interface and Data Specifications 1.0"
        url=http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/riffmci.pdf]][:"asset system" :"file format" :parsing]
[48:32][Set up ParseWAV() to parse any RIFF file, calling IterateRIFF()][:"asset system" :"file format" :parsing]
[52:36][Introduce IterateRIFF() and GetHeaderChunk()][:"asset system" :"file format" :parsing]
[1:00:32][Fix compile errors in the RIFF :parsing code][:"asset system" :"file format"]
[1:03:22][Set up to import our parsed audio data from .hha files][:"asset system" :research]
[1:05:50][Implement ProcessAudioImport(), streaming in our audio assets in chunks, and introduce UnloadAudio()[ref
    site=Wikipedia
    page="Dolby Surround 7.1"
    url=https://en.wikipedia.org/wiki/Dolby_Surround_7.1]][:"asset system" :memory]
[1:21:16][Enable ProcessAudioImport() to tag audio assets with IDs][:"asset system"]
[1:27:03][Let ProcessAudioImport() instead not tag audio streaming chunks, but only reserve enough contiguously indexed asset chunks for the sample chain][:"asset system" :memory]
[1:36:51][Set up ParseTopLevelBlock() to stamp out the audio channel tags][:"asset system" :parsing]
[1:40:43][Q&A][:speech]
[1:41:09][@jkfsda][Q: Not related, but do you have any thoughts on Pony lang?][:language]
[1:42:00][@flightlesshippo][Q: How are you feeling about the way the :"asset system"'s working out so far?]
[1:43:09][@brimonk][Q: What does good :documentation look like? I think I've heard about you and [@naysayer88 Jon] talk about documentation being really bad and soul sucking when it's auto generated. So, what does "good" human made documentation look like for programmers, and for users?[ref
    site="Microsoft Docs"
    page="CreateFileA function"
    url=https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea]]
[1:46:35][@brimonk][Q: So like, Unix man pages, because they lean closer to conceptual :documentation (as far as I can tell), would be more preferable to you?]
[1:47:08][@centhusiast][Q: Does the C code run faster, in general, if we replace something like width /=2 and height /=2 by the left bit shift <<1?][:performance]
[1:47:35][@nonsensation][Q: About Meow hash, do you have any resources on how you came up with it or where I could learn more about designing such?][:hashing]
[1:49:02][@ormone88][Q: Do modern game engines have their own sound synthesizer, or do they just import sounds from other software / libraries?[ref
    site="RAD Game Tools"
    page="The Miles Sound System"
    url=http://www.radgametools.com/miles.htm][ref
        site=fmod
        url=https://www.fmod.com/]][:audio]
[1:52:24][@centhusiast][Q: Could you demonstrate in one episode how you implemented cmirror version control? It seems very interesting. Thanks a lot][:vcs]
[1:55:02][@flightlesshippo][Q: How many times have people given you the old "why reinvent the wheel?" line? I've never seen a discussion about building code from scratch not have at least someone smugly break that one out]
[1:58:36][@ivereadthesequel][Q: Speaking about MSDN, I had an issue where an old version of docs had a remark that was important for a certain call, that some value should be set a certain way in a struct. Not there in the new version. ACKK!! Anyway, doesn't the "remarks" section usually have information on things like "CloseFile" for the "CreateFile" call and so on?][:documentation]
[2:00:27][@jkfsda][Q: Why is Functional Programming not dominating corporate programming? It's much better for business apps][:language]
[2:01:20][@zennmystic][Q: You changed debugger yesterday… To what again?[ref
    site=RemedyBG
    url=https://remedybg.itch.io/remedybg]]
[2:05:00][@spkmodzzyt][Q: Anyway to get ~4coder for free?]
[2:05:28][@ivereadthesequel][Q: Do you know why functional programming languages tend to be so closely tied to formal verification and more theoretical work, by any chance?][:language]
[2:07:11][@spkmodzzyt][Q: Is it license-based?]
[2:07:35][@Brian][Q: Greetings [@cmuratori Casey]. How do you find balancing duplicating code versus trying to generalize a function? As an exercise, I took FormatString() – from [~hero Handmade Hero] – and wrote a FormatWideString() version. In the end I chose to simply take the format, call UTF8FromUTF16(), call FormatString() on a temp buffer, then UTF16FromUTF8(). But now I sacrifice :performance for maintenance. Other than if it becomes a bottleneck when profiling, what other things do you look for choosing to duplicate code and making it more a pain to maintain, than the benefits of having specific versions?][:language]
[2:09:24][Wrap it up with a plug of Handmade Seattle[ref
    site="Handmade Seattle"
    url=https://www.handmade-seattle.com/]][:speech]
[/video]
