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に関しては、バグがあった版でも正しく分類されてる…。となると、端末判別結果のバグのせいでおかしくなってるわけではなさげ。うーん。
[ ツッコむ ]
以上です。