mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-22 16:24:04 +02:00
861f6a23c8
This new system is used for asynchronous decoding of sound data. The main improvement with this one over the old one is the ability to do multi-producer, multi-consumer lock-free posting of messages which means multiple threads can be used to process jobs simultaneously rather than a single thread processing all jobs serially. Decoding is inherently serial which means multiple job threads is only useful when decoding multiple sounds. Each individual sound will be decoded serially. Another change with this commit is the ability for applications to control whether or not the resource manager manages it's own job threads. This is useful if an application wants to manage the job queue themselves if, for example, they want to integrate it more closely with their existing job system.
99 lines
2.8 KiB
C
99 lines
2.8 KiB
C
#define STB_VORBIS_HEADER_ONLY
|
|
#include "../extras/stb_vorbis.c" /* Enables Vorbis decoding. */
|
|
|
|
#define MA_DEBUG_OUTPUT
|
|
#define MA_IMPLEMENTATION
|
|
#include "../miniaudio.h"
|
|
#include "ma_engine.h"
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
ma_result result;
|
|
ma_engine engine;
|
|
ma_sound sound;
|
|
|
|
|
|
if (argc < 2) {
|
|
printf("No input file.\n");
|
|
return -1;
|
|
}
|
|
|
|
result = ma_engine_init(NULL, &engine);
|
|
if (result != MA_SUCCESS) {
|
|
printf("Failed to initialize audio engine.\n");
|
|
return -1;
|
|
}
|
|
|
|
|
|
#if 1
|
|
result = ma_engine_sound_init_from_file(&engine, argv[1], MA_DATA_SOURCE_FLAG_DECODE | MA_DATA_SOURCE_FLAG_ASYNC | MA_DATA_SOURCE_FLAG_STREAM, NULL, &sound);
|
|
if (result != MA_SUCCESS) {
|
|
printf("Failed to load sound: %s\n", argv[1]);
|
|
ma_engine_uninit(&engine);
|
|
return -1;
|
|
}
|
|
|
|
/*ma_data_source_seek_to_pcm_frame(sound.pDataSource, 5000000);*/
|
|
|
|
/*ma_engine_sound_set_volume(&engine, &sound, 0.25f);*/
|
|
ma_engine_sound_set_pitch(&engine, &sound, 1.0f);
|
|
ma_engine_sound_set_pan(&engine, &sound, 0.0f);
|
|
ma_engine_sound_set_looping(&engine, &sound, MA_TRUE);
|
|
ma_engine_sound_start(&engine, &sound);
|
|
#endif
|
|
|
|
#if 1
|
|
/*ma_engine_play_sound(&engine, argv[1], NULL);*/
|
|
/*ma_engine_play_sound(&engine, argv[2], NULL);
|
|
ma_engine_play_sound(&engine, argv[3], NULL);*/
|
|
#endif
|
|
|
|
#if 0
|
|
float pitch = 1;
|
|
float pitchStep = 0.01f;
|
|
float pitchMin = 0.125f;
|
|
float pitchMax = 8;
|
|
for (;;) {
|
|
pitch += pitchStep;
|
|
if (pitch < pitchMin) {
|
|
pitch = pitchMin;
|
|
pitchStep = -pitchStep;
|
|
}
|
|
if (pitch > pitchMax) {
|
|
pitch = pitchMax;
|
|
pitchStep = -pitchStep;
|
|
}
|
|
|
|
ma_engine_sound_set_pitch(&engine, &sound, pitch);
|
|
|
|
ma_sleep(1);
|
|
}
|
|
#endif
|
|
|
|
printf("Press Enter to quit...");
|
|
getchar();
|
|
|
|
ma_engine_sound_uninit(&engine, &sound);
|
|
ma_engine_uninit(&engine);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* stb_vorbis implementation must come after the implementation of miniaudio. */
|
|
#if defined(_MSC_VER) && !defined(__clang__)
|
|
#pragma warning(push)
|
|
#pragma warning(disable:4100) /* unreferenced formal parameter */
|
|
#pragma warning(disable:4244) /* '=': conversion from '' to '', possible loss of data */
|
|
#pragma warning(disable:4245) /* '=': conversion from '' to '', signed/unsigned mismatch */
|
|
#pragma warning(disable:4456) /* declaration of '' hides previous local declaration */
|
|
#pragma warning(disable:4457) /* declaration of '' hides function parameter */
|
|
#pragma warning(disable:4701) /* potentially uninitialized local variable '' used */
|
|
#else
|
|
#endif
|
|
#undef STB_VORBIS_HEADER_ONLY
|
|
#include "../extras/stb_vorbis.c"
|
|
#if defined(_MSC_VER) && !defined(__clang__)
|
|
#pragma warning(pop)
|
|
#else
|
|
#endif
|