Windows: Better error message when no audio output device connected

This commit is contained in:
UnknownShadow200 2021-10-05 08:32:59 +11:00
parent 1982a73be9
commit f51d77e828
3 changed files with 10 additions and 2 deletions

View File

@ -332,6 +332,7 @@ cc_bool Audio_DescribeError(cc_result res, cc_string* dst) {
#define CALLBACK_NULL 0x00000000l #define CALLBACK_NULL 0x00000000l
typedef UINT MMRESULT; typedef UINT MMRESULT;
#define WINMMAPI DECLSPEC_IMPORT #define WINMMAPI DECLSPEC_IMPORT
#define MMSYSERR_BADDEVICEID 2
/* === BEGIN mmeapi.h === */ /* === BEGIN mmeapi.h === */
typedef struct WAVEHDR_ { typedef struct WAVEHDR_ {
LPSTR lpData; LPSTR lpData;
@ -367,6 +368,7 @@ WINMMAPI MMRESULT WINAPI waveOutUnprepareHeader(HWAVEOUT hwo, WAVEHDR* hdr, UINT
WINMMAPI MMRESULT WINAPI waveOutWrite(HWAVEOUT hwo, WAVEHDR* hdr, UINT hdrSize); WINMMAPI MMRESULT WINAPI waveOutWrite(HWAVEOUT hwo, WAVEHDR* hdr, UINT hdrSize);
WINMMAPI MMRESULT WINAPI waveOutReset(HWAVEOUT hwo); WINMMAPI MMRESULT WINAPI waveOutReset(HWAVEOUT hwo);
WINMMAPI MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT err, LPSTR text, UINT textLen); WINMMAPI MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT err, LPSTR text, UINT textLen);
WINMMAPI UINT WINAPI waveOutGetNumDevs(void);
/* === END mmeapi.h === */ /* === END mmeapi.h === */
struct AudioContext { struct AudioContext {
@ -429,7 +431,12 @@ cc_result Audio_SetFormat(struct AudioContext* ctx, int channels, int sampleRate
fmt.nBlockAlign = sampleSize; fmt.nBlockAlign = sampleSize;
fmt.wBitsPerSample = 16; fmt.wBitsPerSample = 16;
fmt.cbSize = 0; fmt.cbSize = 0;
return waveOutOpen(&ctx->handle, WAVE_MAPPER, &fmt, 0, 0, CALLBACK_NULL);
res = waveOutOpen(&ctx->handle, WAVE_MAPPER, &fmt, 0, 0, CALLBACK_NULL);
/* Better error message for this particular case */
if (res == MMSYSERR_BADDEVICEID && waveOutGetNumDevs() == 0)
return ERR_NO_AUDIO_OUTPUT;
return res;
} }
cc_result Audio_QueueData(struct AudioContext* ctx, void* data, cc_uint32 dataSize) { cc_result Audio_QueueData(struct AudioContext* ctx, void* data, cc_uint32 dataSize) {

View File

@ -54,6 +54,6 @@ enum ERRORS_ALL {
INF_ERR_BLOCKTYPE, INF_ERR_LEN_VERIFY, INF_ERR_REPEAT_BEG, INF_ERR_REPEAT_END, INF_ERR_BLOCKTYPE, INF_ERR_LEN_VERIFY, INF_ERR_REPEAT_BEG, INF_ERR_REPEAT_END,
INF_ERR_INVALID_CODE, INF_ERR_NUM_CODES, INF_ERR_INVALID_CODE, INF_ERR_NUM_CODES,
/* Misc other errors */ /* Misc other errors */
ERR_DOWNLOAD_INVALID ERR_DOWNLOAD_INVALID, ERR_NO_AUDIO_OUTPUT
}; };
#endif #endif

View File

@ -82,6 +82,7 @@ static const char* GetCCErrorDesc(cc_result res) {
case CW_ERR_STRING_LEN: return "NBT string too long"; case CW_ERR_STRING_LEN: return "NBT string too long";
case ERR_DOWNLOAD_INVALID: return "Website denied download or doesn't exist"; case ERR_DOWNLOAD_INVALID: return "Website denied download or doesn't exist";
case ERR_NO_AUDIO_OUTPUT: return "No audio output devices plugged in";
} }
return NULL; return NULL;
} }