These pages are written by only Japanese.

Welcom to My Diary.com
最新の日記タイトル一覧カテゴリ別タイトル一覧トップへ戻る〜

こんばんわ♪ 現在は9月23日(月)3時30分。 そろそろお休みになられたほうが。


hns - 日記自動生成システム - Version 2.19.5 (色々 Fixed)

先月 2008年09月 来月
01 02 03 04 05 6
07 08 09 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Namazu for hns による簡易全文検索です。
詳細は 詳細指定/ヘルプをご参照下さい。
検索式:

2008年09月04日(木)

mp3 header 抽出 (2)

煮詰まったので、こんな時は人様のコードをカンニング。:-)

mpglib のヘッダ:

struct buf {
        unsigned char *pnt;
        long size;
        long pos;
        struct buf *next;
        struct buf *prev;
};

struct framebuf {
        struct buf *buf;
        long pos;
        struct frame *next;
        struct frame *prev;
};
あれ?
typedef struct mpstr_tag {
	<略>
    struct frame fr; /* holds the parameters decoded from the header */

むむむ…
struct frame {
    int stereo;
    int jsbound;
    int single;
	<略>
    int bitrate_index;
	<略>
    int framesize; /* computed framesize */
まさしく欲しいデータ構造がそのまま定義されてます。
という訳で、自前で頑張らない方がいいかも。
問題は mpglib は lame の内部で使われる事があっても、 一般には独立してインストールされるとは限らないのが難点。
という訳で、(mpglib を内包してる) lame を使ってみました。
% gcc lame_test.c -L/usr/local/lib -lmp3lame
$ env LD_LIBRARY_PATH=/usr/local/lib ./a.out  game-1.mp3
何となく使い方は分かってきたけど、残念ながら frame header chain を作る API が見つからず。うーむ。

ProjectXI を動かしてみた

FFXI エミュ鯖の実装とバイナリが公開されていたので 試しに動かしてみた。(今月遊ぶ気なかったけど、これだけの為に課金…)

動かす手順:

サーバ側。
  • MySQL を用意する (面倒なので Linux 上で動かしている MySQL に居候)
  • MySQL 上に pxi アカウントを作成 (別のユーザ名でも OK)
  • pxidb を作成する
    sql> CREATE DATABASE pxidb
    
  • ProjectXI\bin\server\misc\pxidb.zip の中にある sql 文を流し込む
    % cat pxidb.sql | mysql -h <秘密のIP> pxidb -u pxi -p
    
  • ProjectXI\bin\server\pxi.ini をいじる
    • 別ホストの MySQL も指定できる
    • pxi 以外のユーザ名をで MySQL にアクセスするなら、設定変更
    • pxi ユーザのパスワードも指定できる (デフォのままだと危険なので要変更)
  • ProjectXI\bin\server\pXI-Server0.6.1.exe を起動
  • ProjectXI\bin\client\pXi-Clientv.exe を起動してアカウント作成
クライアント側
  • ProjectXI\bin\client\pXi-Clientv.exe でログイン (必須?)
  • C:\Windows\system32\drivers\hosts に以下の設定を追記
    127.0.0.1  ffxi00.pol.com
    
  • 普通に FFXI のクライアントを起動。
(09/07 追記) クライアント側は以下の手順じゃないとダメです
  • C:\Windows\system32\drivers\hosts に以下の設定を追記
    127.0.0.1  ffxi00.pol.com
    
  • FFXI のクライアントを起動
  • 同意画面の所まで進める
  • ProjectXI\bin\client\pXi-Clientv.exe でログイン
  • 同意画面で (同意する) のボタンを押す
  • 初めはキャラがいないので、キャラの新規作成から

結果:

問題が発生したため、pXI-Server-0.6.1.exe を終了します。
ご不便をおかけして申し訳ありません。
○rz

めげずに:

エラーダイアログは出てるが、一応プログラムは続行してるので ログコンソールを見ると not found in DB が多発している。 preset 用ファイルではテーブル名が小文字で統一されているが、 大文字の混ざったテーブル名でアクセスしていて、見つからないと怒られてるらしい。
テーブルはファイルにマップされてるので、 Windows で動く MySQL だと問題ないのかな…

それでもめげずに:

試しに接続してみる。
WTF??
Did not find a match?!?!
やっぱりダメか… ○rz

コードを見てみた:

ProjectXI/src/server/src/CNetwork.cpp
if((CGlobal::connectList.size() > 0)) {
        for(i = (CGlobal::connectList.size()-1); i >= 0; i--) {
                //Does the IP match and is the RecvKey free?
                if ((r.ip == CGlobal::connectList.at(i).ip) && (CGlobal::connectList.at(i).s == 0)) {
                        //We found the RecvKey we were looking for!!
                        CConsole::outTime("Found it");
                        break;
                }
        }
}
else {
        //We don't have a list........
        CConsole::outTime("WTF??");
}
//Confirm we are within range and it is valid
if (i < CGlobal::connectList.size()){
        //Store the newly made socket into the connectList
        CGlobal::connectList.at(i).s = r.s;
        CGlobal::connectList.at(i).out = ListenSocket2;
        mysql_thread_init();
        //Run the PolLobbyComm thread
        CreateThread(0,0,PolLobbyComm,&CGlobal::connectList.at(i),0,0);
}
else {
        //How did we not find a match? :(
        CConsole::outTime("Did not find a match?!?!");
}
この connectList に追加する部分は
DWORD WINAPI LobbyServ(LPVOID lpParam)
{
	<略>
while(1) {
        size = sizeof(ip);
        r->out = 0;
        //Listens for our client to connect
        r->s1 = accept(ListenSocket, (struct sockaddr *)&ip, &size);
        if (r->s1 == INVALID_SOCKET) {
        closesocket(ListenSocket);
        CConsole::outErr("accept failed: %d\n", WSAGetLastError());
                WSACleanup();
                return 1;
        }
        //Find the IP address of the client that connected to us
        r->ip = ip.sin_addr.S_un.S_addr;
        r->s = 0;
        //Push the client onto our list
        CGlobal::connectList.push_back(*r);
}
どうも、 54001 の前に 54230 のメッセージを受け取らないといけないのに、 54230 のメッセージが届いてないので、そんなの知らないって言われてそう。 きっと、54230 の thread が落ちてるんだろうなぁ… *1
(ファイアウォールの例外に設定済みなので、届かないって事はないだろうし)
…とりあえず、テーブル名を修正してから考えよう…

テーブル修正後:

SQL preset データがおかしいので修正したら、 エミュ鯖あっさり動いたw
テーブル名の大文字小文字が Preset データとプログラムが要求する文字列とで ずれてたので修正しただけ。
MySQL だけ Linux で動かすという変則的な事したのがまずかったのかも。( ̄― ̄;)
では、オフライン FFXI で遊んできますー 一人ぼっち !||!○rz

動かしてみた:

  • NPC に話しかけても返事なし
  • 魔法のスクロールを使っても習得せず。スクローズ消えないけど
  • 西サルタでバトルが出来た。とりあえず Tiny Mandragora を倒した。
  • 何故か近くの兎(Savanna Rarab)が襲いかかってきたw リンク?ww
  • 戦闘不能になったのでHPに戻るを選択したら、何故かその場で復活したw
  • 試しに兎に近づいたら襲ってきたw アクティブなのかww
楽しすぎるw

GM に変身した所w

コマンド表:

勝手サーバなのでやりたい放題
o @zone - instantly zone yourself to a specified location (e.g. "@zone 0xZZ").
o @additem - puts an item of your choice in your inventory (e.g. "@additem 0xZZZZ").
o @pos - teleport your character to a given position (e.g. "@pos 1 2 3").
o @posr- changes your position relative to your current position (e.g. "@posr 0 2 0").
o @inject - load a packet to be sent to the client (e.g. "@inject packet.dat").
o @debug - print your characters charid and targid to the server
o @gm - toggle GM flag
o @changejob - change your job, the first parameter is the job, the second is the level (e.g. "@changejob 0xA 75")
o @where - echos your current position to the server console.
o @npc - echos the closest npc to you to the server console.
o @zoneR - reloads a zone  (e.g @zoneR 0xf5 (reloads lower jeuno)).
o @hp -	changes your hp, if it sinks to 0, you die. (e.g @hp 0x00 (you die)).
o @mobani - change the animation of the selected mob (e.g @mobani 0x03 (it dies)). 
o @animation - change your character animation (e.g @animation 0x05 (mount a choco)). 
o @cs - play a cutscene in the current zone (e.g. @cs 0x01).
自分以外いないけどねw

その後:

サーバが落ちたので、起動しなおしたら同じ問題(WTF)発生。 さっき動いたのは偶然か。(´Д`;)

*1: (9/9 追記) 54230 は付属の pXi-Clientv.exe でログインする時のパケットみたいです。 同意確認画面が表示されてから、同意するボタンを押すまでの間にログインしないと、 WTF が表示されるのは、54230 のパケットが送られたアドレスを覚えておいて、そこからの 54001 しか許可しないって処理になってる。のかな?

これで、1 日分だよ〜。

タイトル一覧
カテゴリ分類
Database
JXTA
Java
XML
awm
bookmark
keyword
memo
news
research
Powered by hns-2.19.5, HyperNikkiSystem Project