wintoys

wintoys.git
git clone git://git.lenczewski.org/wintoys.git
Log | Files | Refs | README

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