Implemented a Sound Mixer
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
z Toggle filter mode V Revert filter to original state

Menu toggling

q Quotes r References f Filter c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Credits Menu

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