これを文脈から説明するのは非常に難しいですが、それが私を狂わせるので、私は試してみるつもりです。
vst 2.4仕様に基づいて、vstオーディオプラグインのプログラムとバンクの状態を表すバイナリファイルを書き込もうとしています-プログラムは1つのサウンドのパラメーター値であり、バンクはプログラムのコレクションです(私の場合は32 )。私のプログラムの保存/コードのロードは、WindowsとMacで正常に機能します。私の銀行保存コードはMacで正常に機能します-プラグインから状態を保存し、vst-hostのリコールメカニズムを介して開くことができます。私がmacで作成したファイルは、macホストとWindowsホストによってロード可能であり、これが「正しい」vstバンクファイル形式を保存していることを示しています。ただし、Windowsでは、vstバンクファイルに余分なバイトがあり、ホストメカニズムを介してロードされません。これは、ウィンドウにパディングがあるためだと思います。小さいvstプログラムファイルでは発生しないようです。#pragma pack(push、1)多くの異なる場所で役に立たない。誰かがこれを修正するために私が何をする可能性があるか、または何が原因である可能性があるかを提案できますか?
ありがとう
mac hex good:

悪いヘクスに勝つ:

これがコードです。vst fxbファイル形式では、ビッグエンディアンデータが必要なため、バイトスワップが必要です。詳細はこちら: http: //forum.cockos.com/showthread.php?t = 78573
bool IPlugBase::SaveBankAsFXB(const char* defaultFileName)
{
if (mGraphics)
{
WDL_String fileName(defaultFileName, strlen(defaultFileName));
mGraphics->PromptForFile(&fileName, IGraphics::kFileSave, "", "fxb");
if (fileName.GetLength())
{
FILE* fp = fopen(fileName.Get(), "w");
VstInt32 chunkMagic = WDL_bswap_if_le('CcnK');
VstInt32 byteSize = 0;
VstInt32 fxbMagic;
VstInt32 fxbVersion = WDL_bswap_if_le(kFXBVersionNum);
VstInt32 pluginID = WDL_bswap_if_le(GetUniqueID());
VstInt32 pluginVersion = WDL_bswap_if_le(GetEffectVersion(true));
VstInt32 numPgms = WDL_bswap_if_le(NPresets());
VstInt32 currentPgm = WDL_bswap_if_le(GetCurrentPresetIdx());
char future[124];
memset(future, 0, 124);
unsigned int bnkHeaderSize = 80;
unsigned int pgmHeaderSize = 84;
unsigned int pgmSize;
unsigned int bnkSize; // total size in bytes
unsigned int bytePos = 0;
unsigned char *bnk;
if (DoesStateChunks())
{
//TODO
}
else
{
pgmSize = NParams() * 4;
bnkSize = bnkHeaderSize + (NPresets() * (pgmHeaderSize + pgmSize));
bnk = new unsigned char[bnkSize];
fxbMagic = WDL_bswap_if_le('FxBk');
// fxb header
memcpy(bnk + bytePos, &chunkMagic, 4);
bytePos += 4;
memcpy(bnk + bytePos, &byteSize, 4);
bytePos += 4;
memcpy(bnk + bytePos, &fxbMagic, 4);
bytePos += 4;
memcpy(bnk + bytePos, &fxbVersion, 4);
bytePos += 4;
memcpy(bnk + bytePos, &pluginID, 4);
bytePos += 4;
memcpy(bnk + bytePos, &pluginVersion, 4);
bytePos += 4;
memcpy(bnk + bytePos, &numPgms, 4);
bytePos += 4;
memcpy(bnk + bytePos, ¤tPgm, 4);
bytePos += 4;
memcpy(bnk + bytePos, &future, 124);
bytePos += 124;
VstInt32 fxpMagic = WDL_bswap_if_le('FxCk');
VstInt32 fxpVersion = WDL_bswap_if_le(kFXPVersionNum);
VstInt32 numParams = WDL_bswap_if_le(NParams());
for (int p = 0; p < NPresets(); p++)
{
IPreset* pPreset = mPresets.Get(p);
char prgName[28];
memset(prgName, 0, 28);
strcpy(prgName, pPreset->mName);
//fxp header
memcpy(bnk + bytePos, &chunkMagic, 4);
bytePos += 4;
memcpy(bnk + bytePos, &byteSize, 4);
bytePos += 4;
memcpy(bnk + bytePos, &fxpMagic, 4);
bytePos += 4;
memcpy(bnk + bytePos, &fxpVersion, 4);
bytePos += 4;
memcpy(bnk + bytePos, &pluginID, 4);
bytePos += 4;
memcpy(bnk + bytePos, &pluginVersion, 4);
bytePos += 4;
memcpy(bnk + bytePos, &numParams, 4);
bytePos += 4;
memcpy(bnk + bytePos, &prgName, 28);
bytePos += 28;
//fxp data
for (int i = 0; i< NParams(); i++)
{
double v;
pPreset->mChunk.Get(&v, i * sizeof(double));
WDL_EndianFloat v32;
v32.f = (float) mParams.Get(i)->GetNormalized(v);
unsigned int swapped = WDL_bswap_if_le(v32.int32);
memcpy(bnk + bytePos, &swapped, 4);
bytePos += 4;
}
}
}
fwrite(bnk, bnkSize, 1, fp);
fclose(fp);
return true;
}
return false;
}
return false;
}