foobarのランダム再生強化プラグイン

foobarのプレイリストに曲は500以上あるのに
なんでランダム再生の時いつも少ない幾つの何曲ばかり再生してる?

友たちは「そのランダム、規律あるよ」って教えてくれた。

じゃあ自分でランダム再生支援のプラグインを作ってみよう
MT19937を使おう

そして:
http://173.224.214.51/ftp/foo_mt19937_rand.7z (link is now unavailable)

最初のバージョンのソースコード:


#include "sdk\foobar2000.h"
#include "boost\random.hpp"

DECLARE_COMPONENT_VERSION("MT19937 Randomize","0.1",
"Copyright 2011 LeiMing\n"
"http://d.hatena.ne.jp/sorayukinoyume\n"
"Powered by Boost::Random\n"
);

VALIDATE_COMPONENT_FILENAME("foo_mt19937_rand.dll");

class RandomMod : public play_callback_impl_base {
public:
boost::random::mt19937 rng;

RandomMod() : play_callback_impl_base(flag_on_playback_starting) {
rng.seed(GetTickCount());
}

unsigned get_flags() {
return flag_on_playback_starting;
}

void on_playback_starting(play_control::t_track_command p_command,bool p_paused) {
if(p_command == play_control::track_command_next) {
static_api_ptr_t pPlayList;

int nOrder = pPlayList->playback_order_get_active();
const char* strOrder = pPlayList->playback_order_get_name(nOrder);

if(strOrder != 0 && *strOrder == 'R' && strOrder[1] == 'a') {
int pl = pPlayList->get_active_playlist();
int total = pPlayList->playlist_get_item_count(pl);

pPlayList->queue_flush();
pPlayList->queue_add_item_playlist(pl, rng() % total);
}
}
}
};

RandomMod* rm;

class myinitquit : public initquit {
public:
void on_init() {
if(!rm)
rm = new RandomMod();
}
void on_quit() {
delete rm;
}
};

static initquit_factory_t g_myinitquit_factory;

英語版だけにテストした