summary refs log tree commit diff
path: root/src/Audio.h
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2024-06-16 10:35:45 +0300
committerWlodekM <[email protected]>2024-06-16 10:35:45 +0300
commitabef6da56913f1c55528103e60a50451a39628b1 (patch)
treeb3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/Audio.h
initial commit
Diffstat (limited to 'src/Audio.h')
-rw-r--r--src/Audio.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/Audio.h b/src/Audio.h
new file mode 100644
index 0000000..1ab2ae6
--- /dev/null
+++ b/src/Audio.h
@@ -0,0 +1,90 @@
+#ifndef CC_AUDIO_H
+#define CC_AUDIO_H
+#include "Core.h"
+/* Manages playing sound and music.
+   Copyright 2014-2023 ClassiCube | Licensed under BSD-3
+*/
+struct IGameComponent;
+extern struct IGameComponent Audio_Component; 
+struct AudioContext;
+
+#ifdef CC_BUILD_WEBAUDIO
+#define DEFAULT_SOUNDS_VOLUME   0
+#else
+#define DEFAULT_SOUNDS_VOLUME 100
+#endif
+
+#ifdef CC_BUILD_NOMUSIC
+#define DEFAULT_MUSIC_VOLUME   0
+#else
+#define DEFAULT_MUSIC_VOLUME 100
+#endif
+
+union AudioChunkMeta { void* ptr; cc_uintptr val; };
+struct AudioChunk {
+	void* data; /* the raw 16 bit integer samples */
+	cc_uint32 size;
+	union AudioChunkMeta meta;
+};
+
+struct AudioData {
+	struct AudioChunk chunk;
+	int channels;
+	int sampleRate; /* frequency / sample rate */
+	int volume; /* volume data played at (100 = normal volume) */
+	int rate;   /* speed/pitch played at (100 = normal speed) */
+};
+
+/* Volume sounds are played at, from 0-100. */
+/* NOTE: Use Audio_SetSounds, don't change this directly. */
+extern int Audio_SoundsVolume;
+/* Volume music is played at, from 0-100. */
+/* NOTE: Use Audio_SetMusic, don't change this directly. */
+extern int Audio_MusicVolume;
+extern const cc_string Sounds_ZipPathMC;
+extern const cc_string Sounds_ZipPathCC;
+
+void Audio_SetMusic(int volume);
+void Audio_SetSounds(int volume);
+void Audio_PlayDigSound(cc_uint8 type);
+void Audio_PlayStepSound(cc_uint8 type);
+#define AUDIO_MAX_BUFFERS 4
+
+cc_bool AudioBackend_Init(void);
+void    AudioBackend_Tick(void);
+void    AudioBackend_Free(void);
+
+/* Initialises an audio context. */
+cc_result Audio_Init(struct AudioContext* ctx, int buffers);
+/* Stops any playing audio and then frees the audio context. */
+void Audio_Close(struct AudioContext* ctx);
+/* Sets the format of the audio data to be played. */
+/* NOTE: Changing the format can be expensive, depending on the backend. */
+cc_result Audio_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate);
+/* Sets the volume audio data is played at */
+void Audio_SetVolume(struct AudioContext* ctx, int volume);
+/* Queues the given audio chunk for playing. */
+/* NOTE: You MUST ensure Audio_Poll indicates a buffer is free before calling this. */
+/* NOTE: Some backends directly read from the chunk data - therefore you MUST NOT modify it */
+cc_result Audio_QueueChunk(struct AudioContext* ctx, struct AudioChunk* chunk);
+/* Begins playing audio. Audio_QueueChunk must have been used before this. */
+cc_result Audio_Play(struct AudioContext* ctx);
+/* Polls the audio context and then potentially unqueues buffer */
+/* Returns the number of buffers being played or queued */
+/* (e.g. if inUse is 0, no audio buffers are being played or queued) */
+cc_result Audio_Poll(struct AudioContext* ctx, int* inUse);
+cc_result Audio_Pause(struct AudioContext* ctx); /* Only implemented with OpenSL ES backend */
+
+/* Outputs more detailed information about errors with audio. */
+cc_bool Audio_DescribeError(cc_result res, cc_string* dst);
+/* Allocates a group of chunks of data to store audio samples */
+cc_result Audio_AllocChunks(cc_uint32 size, struct AudioChunk* chunks, int numChunks);
+/* Frees a previously allocated group of chunks of data */
+void Audio_FreeChunks(struct AudioChunk* chunks, int numChunks);
+
+extern struct AudioContext music_ctx;
+void Audio_Warn(cc_result res, const char* action);
+
+cc_result AudioPool_Play(struct AudioData* data);
+void AudioPool_Close(void);
+#endif