Handmade Hero»Episode Guide
Loading WAV Files
?
?

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
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link 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

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
1:06Assets: handmade_hero_test_assets_003.zip is released
1:06Assets: handmade_hero_test_assets_003.zip is released
1:06Assets: handmade_hero_test_assets_003.zip is released
2:57handmade_asset.cpp: Correct a mistype in WAVE_fmt
2:57handmade_asset.cpp: Correct a mistype in WAVE_fmt
2:57handmade_asset.cpp: Correct a mistype in WAVE_fmt
4:27handmade.cpp: Do a DEBUGLoadWAV call in GameUpdateAndRender
4:27handmade.cpp: Do a DEBUGLoadWAV call in GameUpdateAndRender
4:27handmade.cpp: Do a DEBUGLoadWAV call in GameUpdateAndRender
5:20Debugger: Step in to DEBUGLoadWAV
5:20Debugger: Step in to DEBUGLoadWAV
5:20Debugger: Step in to DEBUGLoadWAV
6:09Fall foul of Microsoft Visual Studioα
6:09Fall foul of Microsoft Visual Studioα
6:09Fall foul of Microsoft Visual Studioα
7:33handmade_asset.cpp: Introduce riff_iterator to use in DEBUGLoadWAV
7:33handmade_asset.cpp: Introduce riff_iterator to use in DEBUGLoadWAV
7:33handmade_asset.cpp: Introduce riff_iterator to use in DEBUGLoadWAV
10:28handmade_asset.cpp: Add WAVE_ChunkID_data to RIFF_CODE
10:28handmade_asset.cpp: Add WAVE_ChunkID_data to RIFF_CODE
10:28handmade_asset.cpp: Add WAVE_ChunkID_data to RIFF_CODE
11:59handmade_asset.cpp: Continue on writing the usage code for DEBUGLoadWAV
11:59handmade_asset.cpp: Continue on writing the usage code for DEBUGLoadWAV
11:59handmade_asset.cpp: Continue on writing the usage code for DEBUGLoadWAV
13:07handmade_asset.cpp: Introduce ParseChunkAt
13:07handmade_asset.cpp: Introduce ParseChunkAt
13:07handmade_asset.cpp: Introduce ParseChunkAt
13:54handmade_asset.cpp: Introduce NextChunk
13:54handmade_asset.cpp: Introduce NextChunk
13:54handmade_asset.cpp: Introduce NextChunk
15:49handmade_asset.cpp: Introduce IsValid
15:49handmade_asset.cpp: Introduce IsValid
15:49handmade_asset.cpp: Introduce IsValid
16:38handmade_asset.cpp: Continue on writing DEBUGLoadWAV
16:38handmade_asset.cpp: Continue on writing DEBUGLoadWAV
16:38handmade_asset.cpp: Continue on writing DEBUGLoadWAV
17:25handmade_asset.cpp: Introduce GetChunkData
17:25handmade_asset.cpp: Introduce GetChunkData
17:25handmade_asset.cpp: Introduce GetChunkData
18:44Debugger: Step in to DEBUGLoadWAV
18:44Debugger: Step in to DEBUGLoadWAV
18:44Debugger: Step in to DEBUGLoadWAV
21:56handmade_asset.cpp: Remove Chunk from riff_iterator and ParseChunkAt, and instead use it in NextChunk and GetType
21:56handmade_asset.cpp: Remove Chunk from riff_iterator and ParseChunkAt, and instead use it in NextChunk and GetType
21:56handmade_asset.cpp: Remove Chunk from riff_iterator and ParseChunkAt, and instead use it in NextChunk and GetType
22:41Debugger: Continue on stepping through DEBUGLoadWAV
22:41Debugger: Continue on stepping through DEBUGLoadWAV
22:41Debugger: Continue on stepping through DEBUGLoadWAV
23:28Internet: Try and determine whether the RIFF file should end in zeros
23:28Internet: Try and determine whether the RIFF file should end in zeros
23:28Internet: Try and determine whether the RIFF file should end in zeros
26:50handmade_asset.cpp: Pad the Chunk->Size if it is odd
26:50handmade_asset.cpp: Pad the Chunk->Size if it is odd
26:50handmade_asset.cpp: Pad the Chunk->Size if it is odd
27:45handmade_asset.cpp: Subtract 4 from the Header->Size
27:45handmade_asset.cpp: Subtract 4 from the Header->Size
27:45handmade_asset.cpp: Subtract 4 from the Header->Size
28:41Debugger: Step through DEBUGLoadWAV and find that we're correctly iterating over the chunks
28:41Debugger: Step through DEBUGLoadWAV and find that we're correctly iterating over the chunks
28:41Debugger: Step through DEBUGLoadWAV and find that we're correctly iterating over the chunks
29:09handmade_asset.cpp: Assert certain data to be valid
29:09handmade_asset.cpp: Assert certain data to be valid
29:09handmade_asset.cpp: Assert certain data to be valid
30:08Internet: Find out what nBlockAlign means
30:08Internet: Find out what nBlockAlign means
30:08Internet: Find out what nBlockAlign means
31:17handmade_asset.cpp: Assert nBlockAlign to be 2 * nChannels
31:17handmade_asset.cpp: Assert nBlockAlign to be 2 * nChannels
31:17handmade_asset.cpp: Assert nBlockAlign to be 2 * nChannels
31:48handmade_asset.cpp: Set the ChannelCount and SampleData
31:48handmade_asset.cpp: Set the ChannelCount and SampleData
31:48handmade_asset.cpp: Set the ChannelCount and SampleData
32:49handmade_asset.cpp: Assert ChannelCount and SampleData to be valid
32:49handmade_asset.cpp: Assert ChannelCount and SampleData to be valid
32:49handmade_asset.cpp: Assert ChannelCount and SampleData to be valid
33:41handmade_asset.h: Add ChannelCount to loaded_sound
33:41handmade_asset.h: Add ChannelCount to loaded_sound
33:41handmade_asset.h: Add ChannelCount to loaded_sound
34:27Internet: Try to establish how to determine the sample count minus any rounding
34:27Internet: Try to establish how to determine the sample count minus any rounding
34:27Internet: Try to establish how to determine the sample count minus any rounding
34:59handmade_asset.cpp: Compute that SampleCount
34:59handmade_asset.cpp: Compute that SampleCount
34:59handmade_asset.cpp: Compute that SampleCount
35:45handmade_asset.cpp: Introduce GetChunkDataSize
35:45handmade_asset.cpp: Introduce GetChunkDataSize
35:45handmade_asset.cpp: Introduce GetChunkDataSize
36:32handmade_asset.cpp: Create arrays for our SampleData
36:32handmade_asset.cpp: Create arrays for our SampleData
36:32handmade_asset.cpp: Create arrays for our SampleData
37:57Blackboard: Deinterleaving audio channels in place
37:57Blackboard: Deinterleaving audio channels in place
37:57Blackboard: Deinterleaving audio channels in place
44:15handmade_asset.cpp: Write out the swizzling algorithm for the left channel
44:15handmade_asset.cpp: Write out the swizzling algorithm for the left channel
44:15handmade_asset.cpp: Write out the swizzling algorithm for the left channel
46:39handmade_asset.cpp: Spam in some test data
46:39handmade_asset.cpp: Spam in some test data
46:39handmade_asset.cpp: Spam in some test data
49:01Debugger: Check out the values in the right channel
49:01Debugger: Check out the values in the right channel
49:01Debugger: Check out the values in the right channel
50:47handmade.cpp and handmade.h: Reenable tSine
50:47handmade.cpp and handmade.h: Reenable tSine
50:47handmade.cpp and handmade.h: Reenable tSine
52:08handmade.h: Introduce loaded_sound TestSound
52:08handmade.h: Introduce loaded_sound TestSound
52:08handmade.h: Introduce loaded_sound TestSound
53:11handmade.cpp: Comment out GameOutputSound and use TestSound
53:11handmade.cpp: Comment out GameOutputSound and use TestSound
53:11handmade.cpp: Comment out GameOutputSound and use TestSound
55:22Run the game and hear that it doesn't sound very good
55:22Run the game and hear that it doesn't sound very good
55:22Run the game and hear that it doesn't sound very good
56:02Debugger: Step through the SampleIndex loop
56:02Debugger: Step through the SampleIndex loop
56:02Debugger: Step through the SampleIndex loop
56:48handmade.cpp: Make the Sample data be int16
56:48handmade.cpp: Make the Sample data be int16
56:48handmade.cpp: Make the Sample data be int16
57:27Run the game and still hear the clicking
57:27Run the game and still hear the clicking
57:27Run the game and still hear the clicking
57:50Listen to the sound
57:50Listen to the sound
57:50Listen to the sound
58:41handmade.cpp: Read through the SampleIndex loop
58:41handmade.cpp: Read through the SampleIndex loop
58:41handmade.cpp: Read through the SampleIndex loop
59:37Debugger: Step in and inspect the SampleData
59:37Debugger: Step in and inspect the SampleData
59:37Debugger: Step in and inspect the SampleData
1:01:04Internet: Take a look at PCM Data
1:01:04Internet: Take a look at PCM Data
1:01:04Internet: Take a look at PCM Data
1:01:58handmade_asset.cpp: Remove the test code
1:01:58handmade_asset.cpp: Remove the test code
1:01:58handmade_asset.cpp: Remove the test code
1:02:29Run the game and hear it more correctly
1:02:29Run the game and hear it more correctly
1:02:29Run the game and hear it more correctly
1:02:42build.bat: Switch to -O2
1:02:42build.bat: Switch to -O2
1:02:42build.bat: Switch to -O2
1:03:09win32_handmade.cpp: Set GameUpdateHz to MonitorRefreshHz / 2.0f
1:03:09win32_handmade.cpp: Set GameUpdateHz to MonitorRefreshHz / 2.0f
1:03:09win32_handmade.cpp: Set GameUpdateHz to MonitorRefreshHz / 2.0f
1:03:21Run the game and hear it all playing correctly
1:03:21Run the game and hear it all playing correctly
1:03:21Run the game and hear it all playing correctly
1:03:59handmade.cpp: Play music_test.wav
1:03:59handmade.cpp: Play music_test.wav
1:03:59handmade.cpp: Play music_test.wav
1:04:16Q&A
🗩
1:04:16Q&A
🗩
1:04:16Q&A
🗩
1:04:45robotchocolatedino You could try uninterleaving the channels in place like this: http://imgur.com/ZcDu4Tb
🗪
1:04:45robotchocolatedino You could try uninterleaving the channels in place like this: http://imgur.com/ZcDu4Tb
🗪
1:04:45robotchocolatedino You could try uninterleaving the channels in place like this: http://imgur.com/ZcDu4Tb
🗪
1:05:50pseudonym73 Probably the second-easiest way to deinterleave is multi-pass. Swap R0/L1, R2/L3, L4/L5 etc. Then do the same with two-sample blocks, four-sample blocks, etc. Easiest way is to deinterleave directly into mix/output buffer.
🗪
1:05:50pseudonym73 Probably the second-easiest way to deinterleave is multi-pass. Swap R0/L1, R2/L3, L4/L5 etc. Then do the same with two-sample blocks, four-sample blocks, etc. Easiest way is to deinterleave directly into mix/output buffer.
🗪
1:05:50pseudonym73 Probably the second-easiest way to deinterleave is multi-pass. Swap R0/L1, R2/L3, L4/L5 etc. Then do the same with two-sample blocks, four-sample blocks, etc. Easiest way is to deinterleave directly into mix/output buffer.
🗪
1:06:18desuused Why do you need to un-interleave sound? When you play it, you still have to read both left and right values
🗪
1:06:18desuused Why do you need to un-interleave sound? When you play it, you still have to read both left and right values
🗪
1:06:18desuused Why do you need to un-interleave sound? When you play it, you still have to read both left and right values
🗪
1:06:39abnercoimbre People are asking about the benefits of extern C? What issues does it address?
🗪
1:06:39abnercoimbre People are asking about the benefits of extern C? What issues does it address?
🗪
1:06:39abnercoimbre People are asking about the benefits of extern C? What issues does it address?
🗪
1:08:43constantinopol Casey, can you please explain: (Chunk->Size + 1) & -1 ?
🗪
1:08:43constantinopol Casey, can you please explain: (Chunk->Size + 1) & -1 ?
🗪
1:08:43constantinopol Casey, can you please explain: (Chunk->Size + 1) & -1 ?
🗪
1:14:14popcorn0x90 Why are the samples interleaved and not flat?
🗪
1:14:14popcorn0x90 Why are the samples interleaved and not flat?
🗪
1:14:14popcorn0x90 Why are the samples interleaved and not flat?
🗪
1:15:18marumoto If you think of your interleaved data as an Nx2 matrix, then transposition can be viewed as interleaving. Here is an in-place way to do it: https://goo.gl/fgPmrg
🗪
1:15:18marumoto If you think of your interleaved data as an Nx2 matrix, then transposition can be viewed as interleaving. Here is an in-place way to do it: https://goo.gl/fgPmrg
🗪
1:15:18marumoto If you think of your interleaved data as an Nx2 matrix, then transposition can be viewed as interleaving. Here is an in-place way to do it: https://goo.gl/fgPmrg
🗪
1:16:08rpg_ignis Thank you
🗪
1:16:08rpg_ignis Thank you
🗪
1:16:08rpg_ignis Thank you
🗪
1:18:05pragmascrypt Why do you want to change the PCM data in place instead of compacting it to just the information you need and allocating extra space?
🗪
1:18:05pragmascrypt Why do you want to change the PCM data in place instead of compacting it to just the information you need and allocating extra space?
🗪
1:18:05pragmascrypt Why do you want to change the PCM data in place instead of compacting it to just the information you need and allocating extra space?
🗪
1:19:09Wrap it up
🗩
1:19:09Wrap it up
🗩
1:19:09Wrap it up
🗩