#include #include #include #include #include #include using namespace poly; /* -------------------------------------------- */ static mal_uint32 audio_callback(mal_device* dev, mal_uint32 frameCount, void* dest); /* -------------------------------------------- */ std::ifstream ifs; std::vector audio_buffer; size_t bytes_read = 0; /* -------------------------------------------- */ int main(int argc, char* argv[]) { poly_log_init(1024, argc, argv); poly_log_add_sink_stdout(); SX_VERBOSE("MINI AL TEST V1"); mal_decoder dec; mal_result result; mal_device device; mal_device_config config; config = mal_device_config_init_playback(mal_format_s16, 2, 44100, audio_callback); result = mal_device_init(nullptr, mal_device_type_playback, nullptr, &config, nullptr, &device); if (MAL_SUCCESS != result) { SX_ERROR("Failed to init the device. (exit)"); exit(EXIT_FAILURE); } std::ifstream ifs; ifs.open("./data/test/audio/s16le-both-channels.raw", std::ios::in | std::ios::binary); if (false == ifs.is_open()) { SX_ERROR("Failed to open the raw PCM data. (exiting)."); exit(EXIT_FAILURE); } audio_buffer.assign(std::istreambuf_iterator(ifs), std::istreambuf_iterator()); ifs.close(); if (MAL_SUCCESS != mal_device_start(&device)) { SX_ERROR("Failed to start the device (exit)."); exit(EXIT_FAILURE); } printf("Press enter to quit."); getchar(); mal_device_uninit(&device); return 0; } /* -------------------------------------------- */ static mal_uint32 audio_callback(mal_device* dev, mal_uint32 frameCount, void* dest) { size_t to_read = std::min(frameCount * sizeof(uint16_t) * 2, audio_buffer.size()); memcpy(dest, (&audio_buffer[0]) + bytes_read, to_read); bytes_read += to_read; return to_read; } /* -------------------------------------------- */