56 lines
4.1 KiB
Plaintext
56 lines
4.1 KiB
Plaintext
[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Implemented a Sound Mixer" vod_platform=youtube id=UuqcgQxpfO8 annotator=Miblo]
|
|
[1:26][Recap and set the stage for the day]
|
|
[4:24][handmade.h: Introduce playing_sound and add a pointer to it in game_state]
|
|
[7:55][handmade.cpp: Setup the PlayingSound loop]
|
|
[10:12][Blackboard: Working in a 32-bit depth mixing buffer]
|
|
[11:43][handmade.cpp: Introduce RealChannel0 and RealChannel1]
|
|
[12:56][handmade_asset.h: Introduce loaded_sound]
|
|
[13:22][handmade.cpp: Call loaded_sound and sum the Samples in our loop]
|
|
[18:32][handmade.cpp: Loop over the summed sounds, read out of them and write them to the SampleOut buffer]
|
|
[22:21][handmade.cpp: Introduce SamplesToMix and SamplesRemainingInSound to handle the finite nature of the audio]
|
|
[25:28][handmade.h: Add playing_sound *FirstFreePlayingSound to game_state]
|
|
[25:51][handmade.cpp: Use that FirstFreePlayingSound in the PlayingSound loop]
|
|
[26:23][handmade.cpp: Snap the Next pointer earlier in order to protect against the act of having it freed screw up our iteration]
|
|
[28:00][handmade.h: Introduce the concept of a MetaArena]
|
|
[31:11][handmade_asset.h: Add audio assets to asset_type_id]
|
|
[32:10][handmade_asset.cpp: Extend the asset loading to handle audio]
|
|
[34:27][handmade_asset.cpp: Introduce AddSoundAsset]
|
|
[36:26][handmade.cpp: Make the new system emulate what we had at the start of the stream]
|
|
[39:01][handmade_asset.cpp: Introduce GetFirstSlotID and various Get functions for Bitmaps and Sound]
|
|
[45:31][Debugger: Step through the asset loading code]
|
|
[45:51][handmade_asset.cpp: Set the SoundCount to be 256 * Asset_Count]
|
|
[46:11][Debugger: Inspect GameState->FirstPlayingSound]
|
|
[46:35][handmade_asset.cpp: Turn it up to full blast]
|
|
[47:04][Debugger: Step into LoadedSound]
|
|
[48:27][build.bat: Switch to -O2 and run the game]
|
|
[50:13][handmade.cpp: Introduce PlaySound]
|
|
[53:40][Run the game and hear our sound]
|
|
[53:45][handmade.cpp: Call PlaySound upon triggering the Sword]
|
|
[55:09][handmade.h: Add random_series GeneralEntropy to game_state]
|
|
[56:36][Run the game and find that it almost works]
|
|
[56:55][handmade.cpp: Investigate the bug]
|
|
[57:34][Blackboard: Linked list]
|
|
[58:14][handmade.cpp: Correctly construct this linked list]
|
|
[1:01:28][Debugger: Step through the playing_sound linked list]
|
|
[1:04:44][handmade.cpp: Reset SamplesPlayed to 0 in PlaySound]
|
|
[1:05:33][Run the game and hear our sound]
|
|
[1:06:20][Q&A]
|
|
[1:07:33][@robrobby][s the sound buffer logarithmic or linear (decibel or linear values) and do we (have to) account for that in building the sums for the buffer?]
|
|
[1:08:04][@allgamesnetworkvideo][Do you already have someone composing the soundtrack?]
|
|
[1:09:52][@tfnw][A reminder about the parameter order in InterlockedIncrement and the bug it covers up]
|
|
[1:10:41][handmade_asset.cpp: Handle the case when BeginTaskWithMemory in LoadBitmap fails]
|
|
[1:12:04][@flaturated][When mixing a mono sound to stereo, volume of each channel should be 50% for center panned]
|
|
[1:13:32][@soysaucethekid][Will this audio code allow you to play the same sound simultaneously (i.e. if you start the same sound before it finishes the first time)?]
|
|
[1:13:53][@tfnw][The second and third parameters in the compare and swap]
|
|
[1:14:39][handmade_intrinsics.h: Swap those parameters in AtomicCompareExchangeUInt32 and then swap them back and instead change the funtions where it's called]
|
|
[1:16:54][@soysaucethekid][The audio seems to be frame rate dependent at the moment. Could putting it in a separate thread or using interrupts (if you can), make it not frame rate dependent?]
|
|
[1:18:35][@tfnw][Would you mind adding a __sync_val_compare_and_swap(Value, Expected, New) for gcc / clang]
|
|
[1:18:55][handmade_intrinsics.h: Add tfnw's suggestion]
|
|
[1:20:50][handmade.cpp: Play the music instead of the bloop, to demonstrate playing the same sound simultaneously]
|
|
[1:22:14][@robrobby][So why does it work?]
|
|
[1:22:54][Blackboard: Separating asset data from instance data]
|
|
[1:24:35][@cubercaleb][Why use a linked list as opposed to another data structure like a vector?]
|
|
[1:25:52][@waterlimon][But can you take the output of the sound summer mechanism and play that?]
|
|
[1:26:08][Go ahead and call it]
|
|
[/video]
|