void Instance::LoadModList() { if (GetModListFile().FileExists()) { wxFileInputStream inputStream(GetModListFile().GetFullPath()); wxStringList modListFile = ReadAllLines(inputStream); for (wxStringList::iterator iter = modListFile.begin(); iter != modListFile.end(); iter++) { // Normalize the path to the instMods dir. wxFileName modFile(*iter); modFile.Normalize(wxPATH_NORM_ALL, GetInstModsDir().GetFullPath()); modFile.MakeRelativeTo(); if (!Any(modList.begin(), modList.end(), [&modFile] (Mod mod) -> bool { return mod.GetFileName().SameAs(wxFileName(modFile)); })) { //SetNeedsRebuild(); modList.push_back(Mod(modFile)); } } } for (size_t i = 0; i < modList.size(); i++) { if (!modList[i].GetFileName().FileExists()) { SetNeedsRebuild(); modList.erase(modList.begin() + i); i--; } } LoadModListFromDir(GetInstModsDir()); }
SoundSourceModPlug::SoundSourceModPlug(QString qFilename) : SoundSource(qFilename) { m_opened = false; m_fileLength = 0; m_pModFile = 0; qDebug() << "[ModPlug] Loading ModPlug module " << m_qFilename; // read module file to byte array QFile modFile(m_qFilename); modFile.open(QIODevice::ReadOnly); m_fileBuf = modFile.readAll(); modFile.close(); // get ModPlugFile descriptor for later access m_pModFile = ModPlug::ModPlug_Load(m_fileBuf.data(), m_fileBuf.length()); }
Result SoundSourceModPlug::parseTrackMetadataAndCoverArt( TrackMetadata* pTrackMetadata, QImage* /*pCoverArt*/) const { // The modplug library currently does not support reading cover-art from // modplug files -- kain88 (Oct 2014) QFile modFile(getLocalFileName()); modFile.open(QIODevice::ReadOnly); const QByteArray fileBuf(modFile.readAll()); modFile.close(); ModPlug::ModPlugFile* pModFile = ModPlug::ModPlug_Load(fileBuf.constData(), fileBuf.length()); if (NULL != pModFile) { pTrackMetadata->setComment(QString(ModPlug::ModPlug_GetMessage(pModFile))); pTrackMetadata->setTitle(QString(ModPlug::ModPlug_GetName(pModFile))); pTrackMetadata->setDuration(ModPlug::ModPlug_GetLength(pModFile) / 1000); pTrackMetadata->setBitrate(8); // not really, but fill in something... ModPlug::ModPlug_Unload(pModFile); } return pModFile ? OK : ERR; }
Result SoundSourceModPlug::tryOpen(const AudioSourceConfig& /*audioSrcCfg*/) { ScopedTimer t("SoundSourceModPlug::open()"); // read module file to byte array const QString fileName(getLocalFileName()); QFile modFile(fileName); qDebug() << "[ModPlug] Loading ModPlug module " << modFile.fileName(); modFile.open(QIODevice::ReadOnly); m_fileBuf = modFile.readAll(); modFile.close(); // get ModPlugFile descriptor for later access m_pModFile = ModPlug::ModPlug_Load(m_fileBuf.constData(), m_fileBuf.length()); if (m_pModFile == NULL) { // an error occured t.cancel(); qDebug() << "[ModPlug] Could not load module file: " << fileName; return ERR; } DEBUG_ASSERT(0 == (kChunkSizeInBytes % sizeof(m_sampleBuf[0]))); const SINT chunkSizeInSamples = kChunkSizeInBytes / sizeof(m_sampleBuf[0]); const SampleBuffer::size_type bufferSizeLimitInSamples = s_bufferSizeLimit / sizeof(m_sampleBuf[0]); // Estimate size of sample buffer (for better performance) aligned // with the chunk size. Beware: Module length estimation is unreliable // due to loops! const SampleBuffer::size_type estimateMilliseconds = ModPlug::ModPlug_GetLength(m_pModFile); const SampleBuffer::size_type estimateSamples = estimateMilliseconds * kChannelCount * kSamplingRate; const SampleBuffer::size_type estimateChunks = (estimateSamples + (chunkSizeInSamples - 1)) / chunkSizeInSamples; const SampleBuffer::size_type sampleBufferCapacity = math_min( estimateChunks * chunkSizeInSamples, bufferSizeLimitInSamples); m_sampleBuf.reserve(sampleBufferCapacity); qDebug() << "[ModPlug] Reserved " << m_sampleBuf.capacity() << " #samples"; // decode samples into sample buffer while (m_sampleBuf.size() < bufferSizeLimitInSamples) { // reserve enough space in sample buffer const SampleBuffer::size_type currentSize = m_sampleBuf.size(); m_sampleBuf.resize(currentSize + chunkSizeInSamples); const int bytesRead = ModPlug::ModPlug_Read(m_pModFile, &m_sampleBuf[currentSize], kChunkSizeInBytes); // adjust size of sample buffer after reading if (0 < bytesRead) { DEBUG_ASSERT(0 == (bytesRead % sizeof(m_sampleBuf[0]))); const SampleBuffer::size_type samplesRead = bytesRead / sizeof(m_sampleBuf[0]); m_sampleBuf.resize(currentSize + samplesRead); } else { // nothing read -> EOF m_sampleBuf.resize(currentSize); break; // exit loop } } qDebug() << "[ModPlug] Filled Sample buffer with " << m_sampleBuf.size() << " samples."; qDebug() << "[ModPlug] Sample buffer has " << m_sampleBuf.capacity() - m_sampleBuf.size() << " samples unused capacity."; setChannelCount(kChannelCount); setSamplingRate(kSamplingRate); setFrameCount(samples2frames(m_sampleBuf.size())); m_seekPos = 0; return OK; }