Code Monkey home page Code Monkey logo

qmmp-v2m's Introduction

This is a plugin for Qmmp (1.6.0 or greater) which supports V2M file. (V2 Module Player File)

The following packages are required, including development headers, which some vendors split into separate packages:

  • qmmp (1.x or 2.x)
  • qt (5 for qmmp 1.x and 6 for qmmp 2.x)

To build, run Qt's qmake:

If you are building for qmmp 1.x, run:
$ qmake-qt5
And if you are building for qmmp 2.x, run:
$ qmake-qt6

Then build with make:
$ make

To install:
$ make install

This installs the plugin into Qmmp's input plugin directory. To install to a staging area, such as for packaging:
$ make install INSTALL_ROOT=/path/to/staging

qmmp-v2m's People

Contributors

flyxyz123 avatar greedysky avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar

Forkers

flyxyz123

qmmp-v2m's Issues

v2m音乐错误总时长导致提前结束

arch linux, qmmp 2.0.0

新的几个commit后很多v2m音乐会提前结束。研究了一下,发现好像是这里的问题:

bool V2MPlayer::IsPlaying()
{
return (m_base.valid && m_state.state == PlayerState::PLAYING) && ((m_base.maxtime * m_base.timediv) > m_state.cursmpl);
}

相关commit:
fcdbec0#diff-ae6d3d302ede7436f27d122f363f623397032b5ae8bb5f28a655b4336f372457L404-R408

我感觉我本地大部v2m文件maxtime是错误的,也有可能timediv 是错误的,总之大部分文件计算出来的总时长都是错的,大部分音乐实际时长远大于显示时长,这会导致达到显示时长后((m_base.maxtime * m_base.timediv) > m_state.cursmpl)为假从而退出。

真要补这个bug的话得找个方法计算出准确的总时长,但我感觉错误总时长是文件头本身数据就是错的,不太好解决。或者workaround一下,还是用commit之前的return m_base.valid && m_state.state == PlayerState::PLAYING;,见pull request。我是无所谓总时长错误,感觉除了v2m以外很多其他格式总时长也都是错的,目前workaround一下不提前退出我就满意了。

我本地所有v2m文件供参考,来源http://keygenmusic.net
v2m.tar.gz
大部分实际时长远大于显示时长。小部分实际时长远小于显示时长,那几个总时长1个小时多的就是例子,这种好像没影响。小部分实际时长和显示时长相符。如果用qmmp的话打开 waveform seek bar 很容易能分辨出来这三种。

新的两个导致TTKMusicPlayer和qmmp崩溃的.v2m文件

Greedysky/TTKMusicPlayer#101 这个issue的解决方法有瑕疵,这两个以前能打开的.v2m文件现在会导致TTKMusicPlayer和qmmp崩溃:new_badv2m.tar.gz

我看了下代码,下面76-79行好像是原先的解决方法

if (base.spsize > inlen - (d - inptr))
{
base.spsize = inlen - (d - inptr);
}
d += base.spsize;
// small sanity check
if (base.spsize < 0 || base.spsize > 8192)
{
base.spsize = 0;
base.speechdata = 0;
}

这解决方法有个问题是附件中的两个.v2m文件base.spsize大于8192,以前他们是进入下面几行的中的if没问题,现在进入else不知为何就崩溃了
uint32_t spsize = *((uint32_t *)d);
d += 4;
if (!spsize || spsize >= 8192)
{
for (uint32_t i = 0; i < 256; i++)
m_base.speechptrs[i] = " ";
}
else
{
m_base.speechdata = (const char *)d;
d += spsize;
const uint32_t* p32 = (const uint32_t *)m_base.speechdata;
uint32_t n = *(p32++);
for (uint32_t i = 0; i < n; i++)
{
m_base.speechptrs[i] = m_base.speechdata + *(p32++);
}
}

我的解决方法是v2mconv.cpp中先判断if (base.spsize < 0 || base.spsize > 8192) 然后再else if (base.spsize > inlen - (d - inptr)) 当然直接if (base.spsize < 0 || base.spsize > 8192 || (base.spsize > inlen - (d - inptr))) 也行但没必要,鬼知道这个8192到底是啥玩意。当然那个没啥用的d += base.spsize;也要移到下面或者直接删掉。v2mplayer.cpp的原理我没怎么研究,直接改v2mconv.cpp算是个workaround吧,反正能解决问题了,详见PR

只在arch linux + qmmp上测试过,能读取全部v2m文件不崩溃了

要是有啥方法能让读取文件出错时别崩溃直接闪退就好了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.