DuplicateSoundMem が親サウンドの SetCreate3DSoundFlag の設定を引き継ぐのは仕様です
申し訳ありませんが現在の仕様を変更する予定はありません
北条さんのされたいことを実現する方法ですが、以下のような処理は如何でしょうか?
1.サウンドファイルをメモリに読み込む
2.2Dサウンドハンドルが求められたら、2Dサウンドハンドルを LoadSoundMemByMemImage で作成する
既に2Dサウンドハンドルが作成されていたら DuplicateSoundMem で複製する
3.3Dサウンドハンドルが求められたら、3Dサウンドハンドルを LoadSoundMemByMemImage で作成する
既に3Dサウンドハンドルが作成されていたら DuplicateSoundMem で複製する
以下がイメージです( コンパイルできるかどうかは確認していません )
// サウンドデータ構造体
struct SOUNDDATA
{
void *FileData; // サウンドファイル
int FileSize; // サウンドファイルのサイズ
int Handle2DEnable; // 2Dサウンドハンドルが有効かどうか( 0:無効 1:有効 )
int Handle2D; // 2Dサウンドハンドル
int Handle3DEnable; // 3Dサウンドハンドルが有効かどうか( 0:無効 1:有効 )
int Handle3D; // 3Dサウンドハンドル
};
// サウンドデータの初期化
void InitializeSoundData( char *FilePath, SOUNDDATA *Data )
{
int filesize;
FILE *fp;
// サウンドファイルのメモリへの読み込み
fp = fopen( FilePath, "rb" );
fseek( fp, SEEK_END, 0 );
filesize = ftell( fp );
fseek( fp, SEEK_SET, 0 );
Data->FileData = malloc( filesize );
fread( Data->FileData, filesize, 1, fp );
Data->FileSize = filesize;
// ハンドルは無効にしておく
Data->Handle2DEnable = 0;
Data->Handle2D = 0;
Data->Handle3DEnable = 0;
Data->Handle3D = 0;
}
// 2Dサウンドハンドルを作成する
int Create2DSoundHandle( SOUNDDATA *Data )
{
// 2Dサウンドハンドルが無効だったら作成する
if( Data->Handle2DEnable == 0 )
{
// 2Dサウンドハンドルを作成する
SetCreate3DSoundFlag( FALSE );
Data->Handle2D = LoadSoundMemByMemImage( Data->FileData, Data->FileSize );
// 2Dサウンドハンドルが有効であるフラグを立てる
Data->Handle2DEnable = 1;
}
// 2Dサウンドハンドルを複製する
return DuplicateSoundMem( Data->Handle2D );
}
// 3Dサウンドハンドルを作成する
int Create3DSoundHandle( SOUNDDATA *Data )
{
// 3Dサウンドハンドルが無効だったら作成する
if( Data->Handle3DEnable == 0 )
{
// 3Dサウンドハンドルを作成する
SetCreate3DSoundFlag( TRUE );
Data->Handle3D = LoadSoundMemByMemImage( Data->FileData, Data->FileSize );
// 3Dサウンドハンドルが有効であるフラグを立てる
Data->Handle3DEnable = 1;
}
// 3Dサウンドハンドルを複製する
return DuplicateSoundMem( Data->Handle3D );
}