musix 0.3.5

Music player library for esoteric audio formats (music from C64,Amiga etc)
Documentation
#include <string>

#include <audioplayer/audioplayer.h>
#include <coreutils/fifo.h>
#include <coreutils/log.h>
#include <coreutils/utils.h>

#include <csignal>

#include "chipplayer.h"
#include "chipplugin.h"
int main(int argc, const char** argv)
{
    using musix::ChipPlayer;
    using musix::ChipPlugin;

    if (argc < 2) { return 0; }

    logging::setLevel(logging::Level::Info);

    std::string name = argv[1];
    std::string pluginName;

    ChipPlugin::createPlugins("data");

    std::shared_ptr<ChipPlayer> player;
    for (const auto& plugin : ChipPlugin::getPlugins()) {
        if (plugin->canHandle(name)) {
            LOGD("%s can handle", plugin->name());
            if (auto* ptr = plugin->fromFile(name)) {
                player = std::shared_ptr<ChipPlayer>(ptr);
                pluginName = plugin->name();
                break;
            }
        }
    }
    if (!player) {
        printf("No plugin could handle file\n");
        return 0;
    }
    auto len = std::get<uint32_t>(player->meta("length"));
    auto title = std::get<std::string>(player->meta("title"));
    if (title.empty()) { title = utils::path_basename(name); }

    auto format = std::get<std::string>(player->meta("format"));
    printf("Playing: %s [%s/%s] (%02d:%02d)\n", title.c_str(),
           pluginName.c_str(), format.c_str(), len / 60, len % 60);

    utils::Fifo<int16_t> fifo{32768};

    AudioPlayer ap{44100};
    ap.play([&](int16_t* ptr, int size) {
        int rc = fifo.get(ptr, size);
        if (rc <= 0) { memset(ptr, 0, size * 2); }
    });

    std::vector<int16_t> temp(1024 * 4);
    static bool quit = false;
    std::signal(SIGINT, [](int) { quit = true; });
    while (!quit) {
        int rc = player->getSamples(&temp[0], static_cast<int>(temp.size()));
        if (rc > 0) { fifo.put(&temp[0], rc); }
        utils::sleepms(10);
    }
    return 0;
}