S98Player(const string &fileName) : started(false), ended(false) { auto buffer = utils::File(fileName).readAll(); if(!song.OpenFromBuffer(&buffer[0], buffer.size())) throw player_exception(); auto tagOffset = readmem<uint32_t>(&buffer[0x10]); if(tagOffset) { auto tagInfo = string((char*)&buffer[tagOffset + 5], buffer.size() - tagOffset - 5); LOGD(tagInfo); unordered_map<string, string> tags; for(const auto &line : utils::split(tagInfo, "\n")) { auto parts = utils::split(line, "="); if(parts.size() == 2) { wstring jis = utils::jis2unicode((uint8_t*)parts[1].c_str()); string u = utils::utf8_encode(jis); tags[utils::toLower(parts[0])] = u; LOGD("%s=%s", parts[0], u); } } setMeta("sub_title", tags["title"], "composer", tags["artist"], "year", tags["year"], "copyright", tags["copyright"]); } }
USFPlayer(const std::string &fileName) { usf_state = new usf_loader_state; usf_state->emu_state = malloc( usf_get_state_size() ); usf_clear( usf_state->emu_state ); sample_rate = 0; char temp[fileName.length()+1]; strcpy(temp, fileName.c_str()); LOGD("Trying to load USF %s", string(temp)); if ( psf_load( temp, &psf_file_system, 0x21, usf_loader, usf_state, usf_info, usf_state, 1 ) < 0 ) throw player_exception(); usf_set_hle_audio(usf_state->emu_state, 1); PSFFile psf { fileName }; if(psf.valid()) { auto &tags = psf.tags(); int seconds = psf.songLength(); setMeta("composer", tags["artist"], "sub_title", tags["title"], "game", tags["game"], "format", "Nintendo 64", "length", seconds ); } usf_set_compare( usf_state->emu_state, usf_state->enable_compare ); usf_set_fifo_full( usf_state->emu_state, usf_state->enable_fifo_full ); const char *err = usf_render(usf_state->emu_state, 0, 0, &sample_rate); if(err) LOGD("ERROR %s", err); LOGD("######### RATE %d", sample_rate); resampler_init(); for(auto &r : resampler) { r = resampler_create(); resampler_set_quality(r, RESAMPLER_QUALITY_CUBIC); resampler_set_rate(r, (float)sample_rate / 44100.0); //resampler_set_rate(r, 44100.0 / (float)sample_rate); resampler_clear(r); } }
HivelyPlayer(const string &fileName) { tune = hvl_LoadTune(fileName.c_str(), 44100, 0); if(!tune) throw player_exception(); string msg; for(int i=1; i<tune->ht_InstrumentNr; i++) { char *name = tune->ht_Instruments[i].ins_Name; msg = msg + utils::utf8_encode(name) + " "; } setMeta( "title", tune->ht_Name, "message", msg, "channels", tune->ht_Channels, "length", tune->ht_PlayingTime, "format", tune->ht_Version == 0xAA ? "AHX" : "Hively" ); }