2006/07/03(月) [n年前の日記]
#1 [iappli] スクラッチパッドからのサウンドデータの読み込みでエラー
SO902iのみ、エラーになるという報告が。…何故。
SO902i用 mld と、結合したサウンドデータファイルのヘッダー部分をチェック。…オフセットやサイズに関しては意図通りの内容のように見える。うーん。
端末判別の結果が間違っているのだろうか。判別部分だけ別のプログラムに入れて、動作確認。 _ユーザエージェント一覧 と、 _iアプリ対応端末の情報 から、各機種が System.getProperty("microedition.platform") で返すはずの文字列の一覧を作成して、渡してみたり。
結果は下のような感じ。
ヤバイ。一部バグってる。SH505* と SO505* がおかしい。if ( fg == -1 ) { } の外に出して例外的に判別しないといかんのでは。いや、それでもダメだ。比較用文字列を変更しておかないと。いやいや、それでも変だ…。って、あー。ループで比較してるところで、breakが抜けてるじゃないか! なんてこった。
break を入れた。
しかし、SO902iに関しては、バグがあった版でも正しく分類されてる…。となると、端末判別結果のバグのせいでおかしくなってるわけではなさげ。うーん。
SO902i用 mld と、結合したサウンドデータファイルのヘッダー部分をチェック。…オフセットやサイズに関しては意図通りの内容のように見える。うーん。
端末判別の結果が間違っているのだろうか。判別部分だけ別のプログラムに入れて、動作確認。 _ユーザエージェント一覧 と、 _iアプリ対応端末の情報 から、各機種が System.getProperty("microedition.platform") で返すはずの文字列の一覧を作成して、渡してみたり。
/* * iモード端末判別チェックテスト */ public class MachineCheck { // 各端末が、System.getProperty("microedition.platform") で返してくるはずの文字列 static final String[] MACHINE_ID_STRING = { "D505i", "D505iS", "D506i", "D701i", "D701iWM", "D702i", "D702iBCL", "D851iWM", "D900i", "D901i", "D901iS", "D902i", "D902iS", "F505i", "F505iGPS", "F506i", "F700i", "F700iS", "F702iD", "F900i", "F900iC", "F900iT", "F901iC", "F901iS", "F902i", "F902iS", "N505i", "N505iS", "N506i", "N506iS", "N506iS2", "N700i", "N701i", "N701iECO", "N702iD", "N900i", "N900iG", "N900iL", "N900iS", "N901iC", "N901iS", "N902i", "N902iS", "P505i", "P505iS", "P506iC", "P700i", "P701iD", "P702i", "P851i", "P900i", "P900iV", "P901i", "P901iS", "P901iTV", "P902i", "P902iS", "SA700iS", "SA800i", "SH505i", "SH505i2", "SH505iS", "SH506iC", "SH700i", "SH700iS", "SH702iD", "SH900i", "SH901iC", "SH901iS", "SH902i", "SH902iS", "SO505i", "SO505iS", "SO506i", "SO506iC", "SO506iS", "SO702i", "SO902i", "SO902iWP+", }; public static void main(String[] args) { MachineCheckSub m = new MachineCheckSub(); // 端末を判別して読み込むべきサウンドデータ種類を決定 for (int n = 0; n < MACHINE_ID_STRING.length; n++) { // String id = System.getProperty("microedition.platform"); String id = MACHINE_ID_STRING[n]; m.checkMachineString(id); } } } class MachineCheckSub { interface MachineKind { int MK_505_D = 0; int MK_505_F = 1; int MK_505_N = 2; int MK_505_P = 3; int MK_505_SH = 4; int MK_505_SHIS = 5; int MK_505_SO = 6; int MK_505_SOIS = 7; int MK_FOMA3_D = 8; int MK_FOMA3_F = 9; int MK_FOMA3_N = 10; int MK_FOMA3_P = 11; int MK_FOMA3_SH = 12; int MK_FOMA4_SO = 13; int MK_505_P_7XX = 14; } // sound data checksum static final int[] SND_CHKCODE_TBL = { 0x0F68B, // 0 0x0DE83, // 1 0x01228, // 2 0x0F735, // 3 0x0DEAC, // 4 0x02D31, // 5 0x0BC65, // 6 0x029AD, // 7 0x02903, // 8 0x0DE83, // 9 0x02F8A, // 10 0x0DEFB, // 11 0x02AB4, // 12 0x0D261, // 13 0x00000, // 14 }; // sound data byte length static final int[] SND_ALLBYTE_TBL = { 19090, // 0 18834, // 1 18707, // 2 19090, // 3 18844, // 4 19290, // 5 19492, // 6 19290, // 7 19280, // 8 18834, // 9 18807, // 10 18834, // 11 19290, // 12 16292, // 13 0, // 14 }; // sound data count static final int[] SND_PAKMAX_TBL = { 5, // 0 5, // 1 5, // 2 5, // 3 5, // 4 5, // 5 5, // 6 5, // 7 5, // 8 5, // 9 5, // 10 5, // 11 5, // 12 4, // 13 0, // 14 }; static final String[] SNDDIR = { "505/d", // 0 "505/f", // 1 "505/n", // 2 "505/p", // 3 "505/sh", // 4 "505/shiS", // 5 "505/so", // 6 "505/soiS", // 7 "foma3/d", // 8 "foma3/f", // 9 "foma3/n", // 10 "foma3/p", // 11 "foma3/sh", // 12 "foma4/so", // 13 "505/p", // 14 }; // 端末判別用文字列 static final String[] SNDHARD_STR = { "D5", // 0 "D7", // 1 "D8", // 2 "D900", // 3 "D9", // 4 "F5", // 5 "F700", // 6 "F7", // 7 "F9", // 8 "N5", // 9 "N7", // 10 "N9", // 11 "P5", // 12 "P7", // 13 "P8", // 14 "P9", // 15 "SH505i2", // 16 "SH505iS", // 17 "SH506", // 18 "SH505i", // 19 "SH7", // 20 "SH9", // 21 "SO505iS", // 22 "SO506", // 23 "SO505i", // 24 "SO7", // 25 "SO9", // 26 "SA", // 27 }; static final byte[] SNDHARD_NUM = { MachineKind.MK_505_D, // "D5", // 0 MachineKind.MK_505_F, // "D7", // 1 MachineKind.MK_505_F, // "D8", // 2 MachineKind.MK_FOMA3_D, // "D900", // 3 MachineKind.MK_FOMA3_F, // "D9", // 4 MachineKind.MK_505_F, // "F5", // 5 MachineKind.MK_505_F, // "F700", // 6 MachineKind.MK_FOMA3_F, // "F7", // 7 MachineKind.MK_FOMA3_F, // "F9", // 8 MachineKind.MK_505_N, // "N5", // 9 MachineKind.MK_505_N, // "N7", // 10 MachineKind.MK_FOMA3_N, // "N9", // 11 MachineKind.MK_505_P, // "P5", // 12 MachineKind.MK_505_P_7XX, // "P7", // 13 MachineKind.MK_505_P_7XX, // "P8", // 14 MachineKind.MK_FOMA3_P, // "P9", // 15 MachineKind.MK_505_SH, // "SH505i2", // 16 MachineKind.MK_505_SHIS, // "SH505iS", // 17 MachineKind.MK_505_SHIS, // "SH506", // 18 MachineKind.MK_505_SH, // "SH505i", // 19 MachineKind.MK_505_SHIS, // "SH7", // 20 MachineKind.MK_FOMA3_SH, // "SH9", // 21 MachineKind.MK_505_SOIS, // "SO505iS", // 22 MachineKind.MK_505_SOIS, // "SO506", // 23 MachineKind.MK_505_SO, // "SO505i", // 24 MachineKind.MK_505_SOIS, // "SO7", // 25 MachineKind.MK_FOMA4_SO, // "SO9", // 26 MachineKind.MK_505_D, // "SA", // 27 }; // SAxxx は不明機種とするが、仮で D505i のデータを鳴らす。たぶん、三洋製だから同じだろう…。 // SH505ix や SO505ix が後から販売された場合、 // 正しいサウンドが鳴るかは保障しない。でも、販売するなら xx506ix になるんじゃないかな…。 // P70xi は ADPCM のフォーマットが違うので、本来別のデータを用意するが、今回は P505i のソレを流用する。 int snd_chkcode; int snd_allbyte; int snd_pak_max; String sounddatakind; String machine_info; int sounddatakind_number; String soundDataFilename; static final String SNDFNAME = "_sd"; // サウンドパックデータ ファイル名 // String id を元に端末を分類 final void checkMachineString(String id) { machine_info = id; int sni = 0; String sndfilename = SNDFNAME; int fg = -1; for (int i = 0; i < SNDHARD_STR.length; i++) { if (id.indexOf(SNDHARD_STR[i]) != -1) { sni = SNDHARD_NUM[i]; fg = i; } } if (fg == -1) { // 一覧には無い if (id.indexOf("SH5") != -1) { if (id.indexOf("SH505iS") != -1 || id.indexOf("SH506") != -1) { sni = MachineKind.MK_505_SHIS; } else if (id.indexOf("SH505i") != -1 || id.indexOf("SH505i2") != -1) { sni = MachineKind.MK_505_SH; } else { sni = MachineKind.MK_505_SHIS; } fg = 1; } else if (id.indexOf("SO") != -1) { if (id.indexOf("SO505iS") != -1 || id.indexOf("SO506") != -1) { sni = MachineKind.MK_505_SOIS; } else if (id.indexOf("SO505i") != -1) { sni = MachineKind.MK_505_SO; } else { sni = MachineKind.MK_505_SOIS; } fg = 1; } else { // どうしても判別できない・どれにも該当しない場合は、 // 型番からして性能が低そうな P505i 用のソレ、としておく。 sni = MachineKind.MK_505_D; } } sounddatakind_number = sni; snd_chkcode = SND_CHKCODE_TBL[sounddatakind_number]; snd_allbyte = SND_ALLBYTE_TBL[sounddatakind_number]; snd_pak_max = SND_PAKMAX_TBL[sounddatakind_number]; String dls; dls = SNDDIR[sounddatakind_number]; if (sni == MachineKind.MK_505_P_7XX) { sndfilename = sndfilename + "7xx"; } sounddatakind = "[" + sounddatakind_number + "]\t" + dls + "/*" + sndfilename + "\t" + Integer.toString(snd_chkcode, 16) + "\t" + snd_allbyte + "\t" + snd_pak_max; if (fg == -1) sounddatakind = "? " + sounddatakind; System.out.println("id=" + id + "\t" + sounddatakind); soundDataFilename = sndfilename; } }こんな感じで。(後で書くけど、バグ入り。)
結果は下のような感じ。
id=D505i [0] 505/d/*_sd f68b 19090 5 id=D505iS [0] 505/d/*_sd f68b 19090 5 id=D506i [0] 505/d/*_sd f68b 19090 5 id=D701i [1] 505/f/*_sd de83 18834 5 id=D701iWM [1] 505/f/*_sd de83 18834 5 id=D702i [1] 505/f/*_sd de83 18834 5 id=D702iBCL [1] 505/f/*_sd de83 18834 5 id=D851iWM [1] 505/f/*_sd de83 18834 5 id=D900i [9] foma3/f/*_sd de83 18834 5 id=D901i [9] foma3/f/*_sd de83 18834 5 id=D901iS [9] foma3/f/*_sd de83 18834 5 id=D902i [9] foma3/f/*_sd de83 18834 5 id=D902iS [9] foma3/f/*_sd de83 18834 5 id=F505i [1] 505/f/*_sd de83 18834 5 id=F505iGPS [1] 505/f/*_sd de83 18834 5 id=F506i [1] 505/f/*_sd de83 18834 5 id=F700i [9] foma3/f/*_sd de83 18834 5 id=F700iS [9] foma3/f/*_sd de83 18834 5 id=F702iD [9] foma3/f/*_sd de83 18834 5 id=F900i [9] foma3/f/*_sd de83 18834 5 id=F900iC [9] foma3/f/*_sd de83 18834 5 id=F900iT [9] foma3/f/*_sd de83 18834 5 id=F901iC [9] foma3/f/*_sd de83 18834 5 id=F901iS [9] foma3/f/*_sd de83 18834 5 id=F902i [9] foma3/f/*_sd de83 18834 5 id=F902iS [9] foma3/f/*_sd de83 18834 5 id=N505i [2] 505/n/*_sd 1228 18707 5 id=N505iS [2] 505/n/*_sd 1228 18707 5 id=N506i [2] 505/n/*_sd 1228 18707 5 id=N506iS [2] 505/n/*_sd 1228 18707 5 id=N506iS2 [2] 505/n/*_sd 1228 18707 5 id=N700i [2] 505/n/*_sd 1228 18707 5 id=N701i [2] 505/n/*_sd 1228 18707 5 id=N701iECO [2] 505/n/*_sd 1228 18707 5 id=N702iD [2] 505/n/*_sd 1228 18707 5 id=N900i [10] foma3/n/*_sd 2f8a 18807 5 id=N900iG [10] foma3/n/*_sd 2f8a 18807 5 id=N900iL [10] foma3/n/*_sd 2f8a 18807 5 id=N900iS [10] foma3/n/*_sd 2f8a 18807 5 id=N901iC [10] foma3/n/*_sd 2f8a 18807 5 id=N901iS [10] foma3/n/*_sd 2f8a 18807 5 id=N902i [10] foma3/n/*_sd 2f8a 18807 5 id=N902iS [10] foma3/n/*_sd 2f8a 18807 5 id=P505i [3] 505/p/*_sd f735 19090 5 id=P505iS [3] 505/p/*_sd f735 19090 5 id=P506iC [3] 505/p/*_sd f735 19090 5 id=P700i [14] 505/p/*_sd7xx 0 0 0 id=P701iD [14] 505/p/*_sd7xx 0 0 0 id=P702i [14] 505/p/*_sd7xx 0 0 0 id=P851i [14] 505/p/*_sd7xx 0 0 0 id=P900i [11] foma3/p/*_sd defb 18834 5 id=P900iV [11] foma3/p/*_sd defb 18834 5 id=P901i [11] foma3/p/*_sd defb 18834 5 id=P901iS [11] foma3/p/*_sd defb 18834 5 id=P901iTV [11] foma3/p/*_sd defb 18834 5 id=P902i [11] foma3/p/*_sd defb 18834 5 id=P902iS [11] foma3/p/*_sd defb 18834 5 id=SA700iS [0] 505/d/*_sd f68b 19090 5 id=SA800i [0] 505/d/*_sd f68b 19090 5 id=SH505i [4] 505/sh/*_sd deac 18844 5 id=SH505i2 [4] 505/sh/*_sd deac 18844 5 id=SH505iS [4] 505/sh/*_sd deac 18844 5 id=SH506iC [5] 505/shiS/*_sd 2d31 19290 5 id=SH700i [5] 505/shiS/*_sd 2d31 19290 5 id=SH700iS [5] 505/shiS/*_sd 2d31 19290 5 id=SH702iD [5] 505/shiS/*_sd 2d31 19290 5 id=SH900i [12] foma3/sh/*_sd 2ab4 19290 5 id=SH901iC [12] foma3/sh/*_sd 2ab4 19290 5 id=SH901iS [12] foma3/sh/*_sd 2ab4 19290 5 id=SH902i [12] foma3/sh/*_sd 2ab4 19290 5 id=SH902iS [12] foma3/sh/*_sd 2ab4 19290 5 id=SO505i [6] 505/so/*_sd bc65 19492 5 id=SO505iS [6] 505/so/*_sd bc65 19492 5 id=SO506i [7] 505/soiS/*_sd 29ad 19290 5 id=SO506iC [7] 505/soiS/*_sd 29ad 19290 5 id=SO506iS [7] 505/soiS/*_sd 29ad 19290 5 id=SO702i [7] 505/soiS/*_sd 29ad 19290 5 id=SO902i [13] foma4/so/*_sd d261 16292 4 id=SO902iWP+ [13] foma4/so/*_sd d261 16292 4あ。
ヤバイ。一部バグってる。SH505* と SO505* がおかしい。if ( fg == -1 ) { } の外に出して例外的に判別しないといかんのでは。いや、それでもダメだ。比較用文字列を変更しておかないと。いやいや、それでも変だ…。って、あー。ループで比較してるところで、breakが抜けてるじゃないか! なんてこった。
break を入れた。
id=D505i [0] 505/d/*_sd f68b 19090 5 id=D505iS [0] 505/d/*_sd f68b 19090 5 id=D506i [0] 505/d/*_sd f68b 19090 5 id=D701i [1] 505/f/*_sd de83 18834 5 id=D701iWM [1] 505/f/*_sd de83 18834 5 id=D702i [1] 505/f/*_sd de83 18834 5 id=D702iBCL [1] 505/f/*_sd de83 18834 5 id=D851iWM [1] 505/f/*_sd de83 18834 5 id=D900i [8] foma3/d/*_sd 2903 19280 5 id=D901i [9] foma3/f/*_sd de83 18834 5 id=D901iS [9] foma3/f/*_sd de83 18834 5 id=D902i [9] foma3/f/*_sd de83 18834 5 id=D902iS [9] foma3/f/*_sd de83 18834 5 id=F505i [1] 505/f/*_sd de83 18834 5 id=F505iGPS [1] 505/f/*_sd de83 18834 5 id=F506i [1] 505/f/*_sd de83 18834 5 id=F700i [1] 505/f/*_sd de83 18834 5 id=F700iS [1] 505/f/*_sd de83 18834 5 id=F702iD [9] foma3/f/*_sd de83 18834 5 id=F900i [9] foma3/f/*_sd de83 18834 5 id=F900iC [9] foma3/f/*_sd de83 18834 5 id=F900iT [9] foma3/f/*_sd de83 18834 5 id=F901iC [9] foma3/f/*_sd de83 18834 5 id=F901iS [9] foma3/f/*_sd de83 18834 5 id=F902i [9] foma3/f/*_sd de83 18834 5 id=F902iS [9] foma3/f/*_sd de83 18834 5 id=N505i [2] 505/n/*_sd 1228 18707 5 id=N505iS [2] 505/n/*_sd 1228 18707 5 id=N506i [2] 505/n/*_sd 1228 18707 5 id=N506iS [2] 505/n/*_sd 1228 18707 5 id=N506iS2 [2] 505/n/*_sd 1228 18707 5 id=N700i [2] 505/n/*_sd 1228 18707 5 id=N701i [2] 505/n/*_sd 1228 18707 5 id=N701iECO [2] 505/n/*_sd 1228 18707 5 id=N702iD [2] 505/n/*_sd 1228 18707 5 id=N900i [10] foma3/n/*_sd 2f8a 18807 5 id=N900iG [10] foma3/n/*_sd 2f8a 18807 5 id=N900iL [10] foma3/n/*_sd 2f8a 18807 5 id=N900iS [10] foma3/n/*_sd 2f8a 18807 5 id=N901iC [10] foma3/n/*_sd 2f8a 18807 5 id=N901iS [10] foma3/n/*_sd 2f8a 18807 5 id=N902i [10] foma3/n/*_sd 2f8a 18807 5 id=N902iS [10] foma3/n/*_sd 2f8a 18807 5 id=P505i [3] 505/p/*_sd f735 19090 5 id=P505iS [3] 505/p/*_sd f735 19090 5 id=P506iC [3] 505/p/*_sd f735 19090 5 id=P700i [14] 505/p/*_sd7xx 0 0 0 id=P701iD [14] 505/p/*_sd7xx 0 0 0 id=P702i [14] 505/p/*_sd7xx 0 0 0 id=P851i [14] 505/p/*_sd7xx 0 0 0 id=P900i [11] foma3/p/*_sd defb 18834 5 id=P900iV [11] foma3/p/*_sd defb 18834 5 id=P901i [11] foma3/p/*_sd defb 18834 5 id=P901iS [11] foma3/p/*_sd defb 18834 5 id=P901iTV [11] foma3/p/*_sd defb 18834 5 id=P902i [11] foma3/p/*_sd defb 18834 5 id=P902iS [11] foma3/p/*_sd defb 18834 5 id=SA700iS [0] 505/d/*_sd f68b 19090 5 id=SA800i [0] 505/d/*_sd f68b 19090 5 id=SH505i [4] 505/sh/*_sd deac 18844 5 id=SH505i2 [4] 505/sh/*_sd deac 18844 5 id=SH505iS [5] 505/shiS/*_sd 2d31 19290 5 id=SH506iC [5] 505/shiS/*_sd 2d31 19290 5 id=SH700i [5] 505/shiS/*_sd 2d31 19290 5 id=SH700iS [5] 505/shiS/*_sd 2d31 19290 5 id=SH702iD [5] 505/shiS/*_sd 2d31 19290 5 id=SH900i [12] foma3/sh/*_sd 2ab4 19290 5 id=SH901iC [12] foma3/sh/*_sd 2ab4 19290 5 id=SH901iS [12] foma3/sh/*_sd 2ab4 19290 5 id=SH902i [12] foma3/sh/*_sd 2ab4 19290 5 id=SH902iS [12] foma3/sh/*_sd 2ab4 19290 5 id=SO505i [6] 505/so/*_sd bc65 19492 5 id=SO505iS [7] 505/soiS/*_sd 29ad 19290 5 id=SO506i [7] 505/soiS/*_sd 29ad 19290 5 id=SO506iC [7] 505/soiS/*_sd 29ad 19290 5 id=SO506iS [7] 505/soiS/*_sd 29ad 19290 5 id=SO702i [7] 505/soiS/*_sd 29ad 19290 5 id=SO902i [13] foma4/so/*_sd d261 16292 4 id=SO902iWP+ [13] foma4/so/*_sd d261 16292 4これなら合ってる。たぶん。機種分類の一覧表と見比べた限りでは。
しかし、SO902iに関しては、バグがあった版でも正しく分類されてる…。となると、端末判別結果のバグのせいでおかしくなってるわけではなさげ。うーん。
[ ツッコむ ]
以上です。