Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
ygopro
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
ygopro
Commits
39628506
Commit
39628506
authored
Feb 24, 2025
by
nanahira
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add stb_vorbis for ogg support
parent
870b6b9d
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
5777 additions
and
2 deletions
+5777
-2
gframe/miniaudio/premake5.lua
gframe/miniaudio/premake5.lua
+2
-0
gframe/miniaudio/stb_vorbis.c
gframe/miniaudio/stb_vorbis.c
+5443
-0
gframe/miniaudio/stb_vorbis.h
gframe/miniaudio/stb_vorbis.h
+331
-0
gframe/sound_manager.cpp
gframe/sound_manager.cpp
+1
-1
gframe/sound_manager.h
gframe/sound_manager.h
+0
-1
No files found.
gframe/miniaudio/premake5.lua
View file @
39628506
...
@@ -2,5 +2,7 @@ project "cminiaudio"
...
@@ -2,5 +2,7 @@ project "cminiaudio"
kind
"StaticLib"
kind
"StaticLib"
files
{
"*.c"
,
"*.h"
}
files
{
"*.c"
,
"*.h"
}
forceincludes
{
"./stb_vorbis.h"
}
filter
"system:linux"
filter
"system:linux"
links
{
"dl"
,
"pthread"
,
"m"
}
links
{
"dl"
,
"pthread"
,
"m"
}
gframe/miniaudio/stb_vorbis.c
0 → 100644
View file @
39628506
This source diff could not be displayed because it is too large. You can
view the blob
instead.
gframe/miniaudio/stb_vorbis.h
0 → 100644
View file @
39628506
//////////////////////////////////////////////////////////////////////////////
//
// HEADER BEGINS HERE
//
#ifndef STB_VORBIS_INCLUDE_STB_VORBIS_H
#define STB_VORBIS_INCLUDE_STB_VORBIS_H
#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO)
#define STB_VORBIS_NO_STDIO 1
#endif
#ifndef STB_VORBIS_NO_STDIO
#include <stdio.h>
#endif
#ifdef __cplusplus
extern
"C"
{
#endif
/////////// THREAD SAFETY
// Individual stb_vorbis* handles are not thread-safe; you cannot decode from
// them from multiple threads at the same time. However, you can have multiple
// stb_vorbis* handles and decode from them independently in multiple thrads.
/////////// MEMORY ALLOCATION
// normally stb_vorbis uses malloc() to allocate memory at startup,
// and alloca() to allocate temporary memory during a frame on the
// stack. (Memory consumption will depend on the amount of setup
// data in the file and how you set the compile flags for speed
// vs. size. In my test files the maximal-size usage is ~150KB.)
//
// You can modify the wrapper functions in the source (setup_malloc,
// setup_temp_malloc, temp_malloc) to change this behavior, or you
// can use a simpler allocation model: you pass in a buffer from
// which stb_vorbis will allocate _all_ its memory (including the
// temp memory). "open" may fail with a VORBIS_outofmem if you
// do not pass in enough data; there is no way to determine how
// much you do need except to succeed (at which point you can
// query get_info to find the exact amount required. yes I know
// this is lame).
//
// If you pass in a non-NULL buffer of the type below, allocation
// will occur from it as described above. Otherwise just pass NULL
// to use malloc()/alloca()
typedef
struct
{
char
*
alloc_buffer
;
int
alloc_buffer_length_in_bytes
;
}
stb_vorbis_alloc
;
/////////// FUNCTIONS USEABLE WITH ALL INPUT MODES
typedef
struct
stb_vorbis
stb_vorbis
;
typedef
struct
{
unsigned
int
sample_rate
;
int
channels
;
unsigned
int
setup_memory_required
;
unsigned
int
setup_temp_memory_required
;
unsigned
int
temp_memory_required
;
int
max_frame_size
;
}
stb_vorbis_info
;
// get general information about the file
extern
stb_vorbis_info
stb_vorbis_get_info
(
stb_vorbis
*
f
);
// get the last error detected (clears it, too)
extern
int
stb_vorbis_get_error
(
stb_vorbis
*
f
);
// close an ogg vorbis file and free all memory in use
extern
void
stb_vorbis_close
(
stb_vorbis
*
f
);
// this function returns the offset (in samples) from the beginning of the
// file that will be returned by the next decode, if it is known, or -1
// otherwise. after a flush_pushdata() call, this may take a while before
// it becomes valid again.
// NOT WORKING YET after a seek with PULLDATA API
extern
int
stb_vorbis_get_sample_offset
(
stb_vorbis
*
f
);
// returns the current seek point within the file, or offset from the beginning
// of the memory buffer. In pushdata mode it returns 0.
extern
unsigned
int
stb_vorbis_get_file_offset
(
stb_vorbis
*
f
);
/////////// PUSHDATA API
#ifndef STB_VORBIS_NO_PUSHDATA_API
// this API allows you to get blocks of data from any source and hand
// them to stb_vorbis. you have to buffer them; stb_vorbis will tell
// you how much it used, and you have to give it the rest next time;
// and stb_vorbis may not have enough data to work with and you will
// need to give it the same data again PLUS more. Note that the Vorbis
// specification does not bound the size of an individual frame.
extern
stb_vorbis
*
stb_vorbis_open_pushdata
(
unsigned
char
*
datablock
,
int
datablock_length_in_bytes
,
int
*
datablock_memory_consumed_in_bytes
,
int
*
error
,
stb_vorbis_alloc
*
alloc_buffer
);
// create a vorbis decoder by passing in the initial data block containing
// the ogg&vorbis headers (you don't need to do parse them, just provide
// the first N bytes of the file--you're told if it's not enough, see below)
// on success, returns an stb_vorbis *, does not set error, returns the amount of
// data parsed/consumed on this call in *datablock_memory_consumed_in_bytes;
// on failure, returns NULL on error and sets *error, does not change *datablock_memory_consumed
// if returns NULL and *error is VORBIS_need_more_data, then the input block was
// incomplete and you need to pass in a larger block from the start of the file
extern
int
stb_vorbis_decode_frame_pushdata
(
stb_vorbis
*
f
,
unsigned
char
*
datablock
,
int
datablock_length_in_bytes
,
int
*
channels
,
// place to write number of float * buffers
float
***
output
,
// place to write float ** array of float * buffers
int
*
samples
// place to write number of output samples
);
// decode a frame of audio sample data if possible from the passed-in data block
//
// return value: number of bytes we used from datablock
//
// possible cases:
// 0 bytes used, 0 samples output (need more data)
// N bytes used, 0 samples output (resynching the stream, keep going)
// N bytes used, M samples output (one frame of data)
// note that after opening a file, you will ALWAYS get one N-bytes,0-sample
// frame, because Vorbis always "discards" the first frame.
//
// Note that on resynch, stb_vorbis will rarely consume all of the buffer,
// instead only datablock_length_in_bytes-3 or less. This is because it wants
// to avoid missing parts of a page header if they cross a datablock boundary,
// without writing state-machiney code to record a partial detection.
//
// The number of channels returned are stored in *channels (which can be
// NULL--it is always the same as the number of channels reported by
// get_info). *output will contain an array of float* buffers, one per
// channel. In other words, (*output)[0][0] contains the first sample from
// the first channel, and (*output)[1][0] contains the first sample from
// the second channel.
extern
void
stb_vorbis_flush_pushdata
(
stb_vorbis
*
f
);
// inform stb_vorbis that your next datablock will not be contiguous with
// previous ones (e.g. you've seeked in the data); future attempts to decode
// frames will cause stb_vorbis to resynchronize (as noted above), and
// once it sees a valid Ogg page (typically 4-8KB, as large as 64KB), it
// will begin decoding the _next_ frame.
//
// if you want to seek using pushdata, you need to seek in your file, then
// call stb_vorbis_flush_pushdata(), then start calling decoding, then once
// decoding is returning you data, call stb_vorbis_get_sample_offset, and
// if you don't like the result, seek your file again and repeat.
#endif
////////// PULLING INPUT API
#ifndef STB_VORBIS_NO_PULLDATA_API
// This API assumes stb_vorbis is allowed to pull data from a source--
// either a block of memory containing the _entire_ vorbis stream, or a
// FILE * that you or it create, or possibly some other reading mechanism
// if you go modify the source to replace the FILE * case with some kind
// of callback to your code. (But if you don't support seeking, you may
// just want to go ahead and use pushdata.)
#if !defined(STB_VORBIS_NO_STDIO) && !defined(STB_VORBIS_NO_INTEGER_CONVERSION)
extern
int
stb_vorbis_decode_filename
(
const
char
*
filename
,
int
*
channels
,
int
*
sample_rate
,
short
**
output
);
#endif
#if !defined(STB_VORBIS_NO_INTEGER_CONVERSION)
extern
int
stb_vorbis_decode_memory
(
const
unsigned
char
*
mem
,
int
len
,
int
*
channels
,
int
*
sample_rate
,
short
**
output
);
#endif
// decode an entire file and output the data interleaved into a malloc()ed
// buffer stored in *output. The return value is the number of samples
// decoded, or -1 if the file could not be opened or was not an ogg vorbis file.
// When you're done with it, just free() the pointer returned in *output.
extern
stb_vorbis
*
stb_vorbis_open_memory
(
const
unsigned
char
*
data
,
int
len
,
int
*
error
,
stb_vorbis_alloc
*
alloc_buffer
);
// create an ogg vorbis decoder from an ogg vorbis stream in memory (note
// this must be the entire stream!). on failure, returns NULL and sets *error
#ifndef STB_VORBIS_NO_STDIO
extern
stb_vorbis
*
stb_vorbis_open_filename
(
const
char
*
filename
,
int
*
error
,
stb_vorbis_alloc
*
alloc_buffer
);
// create an ogg vorbis decoder from a filename via fopen(). on failure,
// returns NULL and sets *error (possibly to VORBIS_file_open_failure).
extern
stb_vorbis
*
stb_vorbis_open_file
(
FILE
*
f
,
int
close_handle_on_close
,
int
*
error
,
stb_vorbis_alloc
*
alloc_buffer
);
// create an ogg vorbis decoder from an open FILE *, looking for a stream at
// the _current_ seek point (ftell). on failure, returns NULL and sets *error.
// note that stb_vorbis must "own" this stream; if you seek it in between
// calls to stb_vorbis, it will become confused. Morever, if you attempt to
// perform stb_vorbis_seek_*() operations on this file, it will assume it
// owns the _entire_ rest of the file after the start point. Use the next
// function, stb_vorbis_open_file_section(), to limit it.
extern
stb_vorbis
*
stb_vorbis_open_file_section
(
FILE
*
f
,
int
close_handle_on_close
,
int
*
error
,
stb_vorbis_alloc
*
alloc_buffer
,
unsigned
int
len
);
// create an ogg vorbis decoder from an open FILE *, looking for a stream at
// the _current_ seek point (ftell); the stream will be of length 'len' bytes.
// on failure, returns NULL and sets *error. note that stb_vorbis must "own"
// this stream; if you seek it in between calls to stb_vorbis, it will become
// confused.
#endif
extern
int
stb_vorbis_seek_frame
(
stb_vorbis
*
f
,
unsigned
int
sample_number
);
extern
int
stb_vorbis_seek
(
stb_vorbis
*
f
,
unsigned
int
sample_number
);
// NOT WORKING YET
// these functions seek in the Vorbis file to (approximately) 'sample_number'.
// after calling seek_frame(), the next call to get_frame_*() will include
// the specified sample. after calling stb_vorbis_seek(), the next call to
// stb_vorbis_get_samples_* will start with the specified sample. If you
// do not need to seek to EXACTLY the target sample when using get_samples_*,
// you can also use seek_frame().
extern
void
stb_vorbis_seek_start
(
stb_vorbis
*
f
);
// this function is equivalent to stb_vorbis_seek(f,0), but it
// actually works
extern
unsigned
int
stb_vorbis_stream_length_in_samples
(
stb_vorbis
*
f
);
extern
float
stb_vorbis_stream_length_in_seconds
(
stb_vorbis
*
f
);
// these functions return the total length of the vorbis stream
extern
int
stb_vorbis_get_frame_float
(
stb_vorbis
*
f
,
int
*
channels
,
float
***
output
);
// decode the next frame and return the number of samples. the number of
// channels returned are stored in *channels (which can be NULL--it is always
// the same as the number of channels reported by get_info). *output will
// contain an array of float* buffers, one per channel. These outputs will
// be overwritten on the next call to stb_vorbis_get_frame_*.
//
// You generally should not intermix calls to stb_vorbis_get_frame_*()
// and stb_vorbis_get_samples_*(), since the latter calls the former.
#ifndef STB_VORBIS_NO_INTEGER_CONVERSION
extern
int
stb_vorbis_get_frame_short_interleaved
(
stb_vorbis
*
f
,
int
num_c
,
short
*
buffer
,
int
num_shorts
);
extern
int
stb_vorbis_get_frame_short
(
stb_vorbis
*
f
,
int
num_c
,
short
**
buffer
,
int
num_samples
);
#endif
// decode the next frame and return the number of samples per channel. the
// data is coerced to the number of channels you request according to the
// channel coercion rules (see below). You must pass in the size of your
// buffer(s) so that stb_vorbis will not overwrite the end of the buffer.
// The maximum buffer size needed can be gotten from get_info(); however,
// the Vorbis I specification implies an absolute maximum of 4096 samples
// per channel. Note that for interleaved data, you pass in the number of
// shorts (the size of your array), but the return value is the number of
// samples per channel, not the total number of samples.
// Channel coercion rules:
// Let M be the number of channels requested, and N the number of channels present,
// and Cn be the nth channel; let stereo L be the sum of all L and center channels,
// and stereo R be the sum of all R and center channels (channel assignment from the
// vorbis spec).
// M N output
// 1 k sum(Ck) for all k
// 2 * stereo L, stereo R
// k l k > l, the first l channels, then 0s
// k l k <= l, the first k channels
// Note that this is not _good_ surround etc. mixing at all! It's just so
// you get something useful.
extern
int
stb_vorbis_get_samples_float_interleaved
(
stb_vorbis
*
f
,
int
channels
,
float
*
buffer
,
int
num_floats
);
extern
int
stb_vorbis_get_samples_float
(
stb_vorbis
*
f
,
int
channels
,
float
**
buffer
,
int
num_samples
);
// gets num_samples samples, not necessarily on a frame boundary--this requires
// buffering so you have to supply the buffers. DOES NOT APPLY THE COERCION RULES.
// Returns the number of samples stored per channel; it may be less than requested
// at the end of the file. If there are no more samples in the file, returns 0.
#ifndef STB_VORBIS_NO_INTEGER_CONVERSION
extern
int
stb_vorbis_get_samples_short_interleaved
(
stb_vorbis
*
f
,
int
channels
,
short
*
buffer
,
int
num_shorts
);
extern
int
stb_vorbis_get_samples_short
(
stb_vorbis
*
f
,
int
channels
,
short
**
buffer
,
int
num_samples
);
#endif
// gets num_samples samples, not necessarily on a frame boundary--this requires
// buffering so you have to supply the buffers. Applies the coercion rules above
// to produce 'channels' channels. Returns the number of samples stored per channel;
// it may be less than requested at the end of the file. If there are no more
// samples in the file, returns 0.
#endif
//////// ERROR CODES
enum
STBVorbisError
{
VORBIS__no_error
,
VORBIS_need_more_data
=
1
,
// not a real error
VORBIS_invalid_api_mixing
,
// can't mix API modes
VORBIS_outofmem
,
// not enough memory
VORBIS_feature_not_supported
,
// uses floor 0
VORBIS_too_many_channels
,
// STB_VORBIS_MAX_CHANNELS is too small
VORBIS_file_open_failure
,
// fopen() failed
VORBIS_seek_without_length
,
// can't seek in unknown-length file
VORBIS_unexpected_eof
=
10
,
// file is truncated?
VORBIS_seek_invalid
,
// seek past EOF
// decoding errors (corrupt/invalid stream) -- you probably
// don't care about the exact details of these
// vorbis errors:
VORBIS_invalid_setup
=
20
,
VORBIS_invalid_stream
,
// ogg errors:
VORBIS_missing_capture_pattern
=
30
,
VORBIS_invalid_stream_structure_version
,
VORBIS_continued_packet_flag_invalid
,
VORBIS_incorrect_stream_serial_number
,
VORBIS_invalid_first_page
,
VORBIS_bad_packet_type
,
VORBIS_cant_find_last_page
,
VORBIS_seek_failed
,
};
#ifdef __cplusplus
}
#endif
#endif // STB_VORBIS_INCLUDE_STB_VORBIS_H
//
// HEADER ENDS HERE
//
//////////////////////////////////////////////////////////////////////////////
\ No newline at end of file
gframe/sound_manager.cpp
View file @
39628506
...
@@ -216,7 +216,7 @@ void SoundManager::PlayMusic(char* song, bool loop) {
...
@@ -216,7 +216,7 @@ void SoundManager::PlayMusic(char* song, bool loop) {
BufferIO
::
DecodeUTF8
(
song
,
song_w
);
BufferIO
::
DecodeUTF8
(
song
,
song_w
);
ma_sound_init_from_file_w
(
&
engineMusic
,
song_w
,
MA_SOUND_FLAG_ASYNC
|
MA_SOUND_FLAG_STREAM
,
nullptr
,
nullptr
,
&
soundBGM
);
ma_sound_init_from_file_w
(
&
engineMusic
,
song_w
,
MA_SOUND_FLAG_ASYNC
|
MA_SOUND_FLAG_STREAM
,
nullptr
,
nullptr
,
&
soundBGM
);
#else
#else
ma_sound_init_from_file
(
&
engineMusic
,
song
,
MA_SOUND_FLAG_ASYNC
|
MA_SOUND_FLAG_STREAM
,
nullptr
,
nullptr
,
&
soundBGM
);
auto
res
=
ma_sound_init_from_file
(
&
engineMusic
,
song
,
MA_SOUND_FLAG_ASYNC
|
MA_SOUND_FLAG_STREAM
,
nullptr
,
nullptr
,
&
soundBGM
);
#endif
#endif
ma_sound_set_looping
(
&
soundBGM
,
loop
);
ma_sound_set_looping
(
&
soundBGM
,
loop
);
ma_sound_start
(
&
soundBGM
);
ma_sound_start
(
&
soundBGM
);
...
...
gframe/sound_manager.h
View file @
39628506
...
@@ -4,7 +4,6 @@
...
@@ -4,7 +4,6 @@
#include "game.h"
#include "game.h"
#include "../ocgcore/mtrandom.h"
#include "../ocgcore/mtrandom.h"
#ifdef YGOPRO_USE_AUDIO
#ifdef YGOPRO_USE_AUDIO
#define MINIAUDIO_IMPLEMENTATION
#include "miniaudio/miniaudio.h"
#include "miniaudio/miniaudio.h"
#endif
#endif
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment