summary refs log tree commit diff
path: root/src/Vorbis.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/Vorbis.h
initial commit
Diffstat (limited to 'src/Vorbis.h')
-rw-r--r--src/Vorbis.h69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/Vorbis.h b/src/Vorbis.h
new file mode 100644
index 0000000..94385b8
--- /dev/null
+++ b/src/Vorbis.h
@@ -0,0 +1,69 @@
+#ifndef CC_VORBIS_H
+#define CC_VORBIS_H
+#include "Core.h"
+/* 
+Decodes ogg vorbis audio into 16 bit PCM samples
+Copyright 2014-2023 ClassiCube | Licensed under BSD-3
+*/
+struct Stream;
+#define VORBIS_MAX_CHANS 8
+#define VORBIS_MAX_BLOCK_SIZE 8192
+#define OGG_BUFFER_SIZE (255 * 256)
+
+struct OggState {
+	cc_uint8* cur; 
+	cc_uint32 left, last;
+	struct Stream* source;
+	int segmentsRead, numSegments;
+	cc_uint8 buffer[OGG_BUFFER_SIZE];
+	cc_uint8 segments[255];
+};
+
+/* Wraps an OGG container around an existing stream. */
+void Ogg_Init(struct OggState* ctx, struct Stream* source);
+struct Codebook; struct Floor; struct Residue; struct Mapping; struct Mode;
+
+struct imdct_state {
+	int n, log2_n;
+	float a[VORBIS_MAX_BLOCK_SIZE / 2];
+	float b[VORBIS_MAX_BLOCK_SIZE / 2];
+	float c[VORBIS_MAX_BLOCK_SIZE / 4];
+	cc_uint32 reversed[VORBIS_MAX_BLOCK_SIZE / 8];
+};
+
+struct VorbisWindow { float* Prev; float* Cur; };
+struct VorbisState {
+	cc_uint32 Bits;    /* Holds bits across byte boundaries*/
+	cc_uint32 NumBits; /* Number of bits in Bits buffer*/
+	struct OggState* source; /* Source for filling Input buffer */
+
+	cc_uint8 channels, modeNumBits;
+	cc_uint16 curBlockSize, prevBlockSize, dataSize, numCodebooks;
+	int sampleRate; int blockSizes[2];
+	float* temp; /* temp array reused in places */
+	float* values[2]; /* swapped each frame */
+	float* prevOutput[VORBIS_MAX_CHANS];
+	float* curOutput[VORBIS_MAX_CHANS];
+
+	struct Codebook* codebooks;
+	struct Floor* floors;
+	struct Residue* residues;
+	struct Mapping* mappings;
+	struct Mode* modes;
+
+	float* windowRaw;
+	struct VorbisWindow windows[2];
+	struct imdct_state imdct[2];
+};
+
+/* Initialises the given context to defaults */
+void Vorbis_Init(struct VorbisState* ctx);
+/* Frees all memory dynamically allocated by the given context */
+void Vorbis_Free(struct VorbisState* ctx);
+/* Reads and decodes the initial vorbis headers and setup data. */
+cc_result Vorbis_DecodeHeaders(struct VorbisState* ctx);
+/* Reads and decodes the current frame's audio data. */
+cc_result Vorbis_DecodeFrame(struct VorbisState* ctx);
+/* Produces final interleaved audio samples for the current frame. */
+int Vorbis_OutputFrame(struct VorbisState* ctx, cc_int16* data);
+#endif