wasapidemo.h (3747B)
1 #ifndef WSAPIDEMO_H 2 #define WSAPIDEMO_H 3 4 #include <inttypes.h> 5 #include <limits.h> 6 #include <stdalign.h> 7 #include <stdbool.h> 8 #include <stdint.h> 9 10 #ifdef __cplusplus 11 extern "C" { 12 #endif /* __cplusplus */ 13 14 typedef unsigned char c8; 15 16 typedef int32_t b32; 17 18 typedef uint8_t u8; 19 typedef uint16_t u16; 20 typedef uint32_t u32; 21 typedef uint64_t u64; 22 23 typedef int8_t s8; 24 typedef int16_t s16; 25 typedef int32_t s32; 26 typedef int64_t s64; 27 28 typedef float f32; 29 typedef double f64; 30 31 #define internal static 32 #define global_variable static 33 #define function_local static 34 35 #define KiB 1024ULL 36 #define MiB (KiB * 1024) 37 #define GiB (MiB * 1024) 38 #define TiB (GiB * 1024) 39 40 #define MSECS 1000ULL 41 #define USECS (MSECS * 1000) 42 #define NSECS (USECS * 1000) 43 44 #define ARRLEN(arr) (sizeof (arr) / sizeof (arr)[0]) 45 46 #define TESTBIT(v, mask) (((v) & (mask)) == (mask)) 47 48 #define MIN(a, b) (((a) < (b)) ? (a) : (b)) 49 #define MAX(a, b) (((a) > (b)) ? (a) : (b)) 50 #define CLAMP(v, lo, hi) MAX(MIN((v), (hi)), (lo)) 51 52 #if HANDMADE_INTERNAL 53 #define ASSERT(condition) if (!(condition)) { *(volatile u32 *)0 = 0; } 54 #else 55 #define ASSERT(condition) 56 #endif 57 58 #define IS_ALIGNED(addr, align) (((addr) & (align - 1)) == 0) 59 #define ALIGN_NEXT(addr, align) (((addr) + (align - 1)) & ~(align - 1)) 60 #define ALIGN_PREV(addr, align) ((addr) & ~(align - 1)) 61 62 #include <immintrin.h> 63 64 #define SOUND_CHANNELS 2 65 #define SOUND_SAMPLE_RATE 48000 66 #define SOUND_SAMPLE_BITS 16 67 #define SOUND_FRAME_BYTES ((SOUND_SAMPLE_BITS / 8) * SOUND_CHANNELS) 68 69 struct wasapidemo_audio_buffer { 70 void *buffer; 71 u32 expected_samples; 72 u32 sample_rate; 73 u32 channels; 74 }; 75 76 #define WASAPIDEMO_MIXER_FUNDAMENTAL 256 77 78 struct wasapidemo_mixer { 79 f32 tone_hz; 80 f32 tone_volume; 81 f32 tone_t; 82 }; 83 84 void 85 init_sound(struct wasapidemo_mixer *mixer); 86 87 void 88 render_sound(struct wasapidemo_audio_buffer *buffer, struct wasapidemo_mixer *mixer, f32 dt); 89 90 #define USE_WASAPI 1 91 92 #ifdef __cplusplus 93 } 94 #endif /* __cplusplus */ 95 96 // TODO: remove me! 97 #include <stdio.h> 98 99 #define WIN32_LEAN_AND_MEAN 1 100 #include <windows.h> 101 #include <timeapi.h> 102 103 // NOTE: multimedia thread characteristics header 104 #include <avrt.h> 105 106 // NOTE: shared audio format headers 107 #include <mmreg.h> 108 //#include <ksmedia.h> // TODO: find how to get KSDATAFORMAT_SUBTYPE_PCM 109 110 // NOTE: wasapi headers 111 #define COBJMACROS 1 // TODO: required to expose c-style macros for WASAPI, why? 112 #define CONST_VTABLE 1 // TODO: taken from vlc/wasapi.c, what does this do? 113 #include <initguid.h> 114 #include <mmdeviceapi.h> 115 #include <audioclient.h> 116 117 // NOTE: dsound headers 118 #include <dsound.h> 119 120 #if HANDMADE_INTERNAL 121 #define WIN32_MEMORY_BASE ((LPVOID) (TiB * 2)) 122 #else 123 #define WIN32_MEMORY_BASE NULL 124 #endif 125 126 #define WIN32_FILE_PATH_MAX 256 127 128 internal u64 129 win32_perf_micros(void); 130 131 internal void 132 win32_process_pending_messages(void); 133 134 LRESULT CALLBACK 135 win32_window_proc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam); 136 137 struct win32_dsound_buffer { 138 LPDIRECTSOUNDBUFFER buffer; 139 u32 buffer_size; 140 u32 buffer_cursor; 141 u32 sample_rate; 142 u32 sample_bits; 143 u32 channels; 144 u32 block_size; 145 }; 146 147 internal void 148 win32_init_dsound(HWND window, WAVEFORMATEX *sound_format, u32 buffer_size); 149 150 internal void 151 win32_clear_dsound_buffer(void); 152 153 internal void 154 win32_fill_dsound_buffer(DWORD ptr, DWORD size, struct wasapidemo_audio_buffer const *source); 155 156 internal void 157 win32_dsound_stop(void); 158 159 struct win32_wasapi_buffer { 160 IAudioClient3 *audio_client; 161 IAudioRenderClient *render_client; 162 u32 buffer_frame_count; 163 }; 164 165 #define REFTIMES_PER_SEC 10000000 166 #define REFTIMES_PER_MSEC 10000 167 168 internal void 169 win32_init_wasapi(WAVEFORMATEX *sound_format, u32 buffer_frames); 170 171 internal void 172 win32_fill_wasapi_buffer(UINT32 frames, struct wasapidemo_audio_buffer const *source); 173 174 internal void 175 win32_wasapi_stop(void); 176 177 #endif