SDE_ERR sdMltDownloadEx( handle )
SDMEMBLK handle
handle メモリブロックハンドル
SDE_ERR_NOTHING エラーなし SDE_ERR_NO_INIT Sound Library が初期化されていない SDE_ERR_HANDLE_NULL ハンドルがNULL SDE_ERR_HANDLE_ILLEGAL_VALUE ハンドルが不正なアドレスを指している SDE_ERR_BANK_ILLEGAL_TYPE Bank タイプが異常 SDE_ERR_PTR_NULL ダウンロード元のメモリブロックポインタがNULL SDE_ERR_BANK_ILLEGAL_CHECK_SUM Multi Unitが壊れている可能性がある
MultiUnitをメインメモリからサウンドメモリへ転送します。 sdMltDownload()関数との違いはMulti Unitを分割してダウンロードできることです。 例えばファイルシステムからMulti Unitファイルを4000Hバイト毎読み込んでsdMltDownloadEx()関数で 分割サイズごとに転送するなどといったことができます。
Bool sndMltDownloadFromFile( const char *file_name, Void *mlt_buf_ptr, Sint32 mlt_buf_sz) { Bool result = TRUE; Sint32 file_sz; Sint32 file_sct_sz; Sint32 read_buf_sz; Sint32 read_buf_sct_sz; Sint32 read_sct_num; if ( sndgDatWrk.m_MltGdfsHandle != NULL) { result = FALSE; goto exit; } if ( sndgDatWrk.m_MltMemblkHandle == NULL) { result = FALSE; goto exit; } read_buf_sct_sz = gdFsCalcSctSize( mlt_buf_sz); read_buf_sz = read_buf_sct_sz * GDD_FS_SCTSIZE; sndgDatWrk.m_MltBufPtr = mlt_buf_ptr; sndgDatWrk.m_MltBufSz = read_buf_sz; sndgDatWrk.m_MltGdfsHandle = gdFsOpen( file_name, NULL); if ( sndgDatWrk.m_MltGdfsHandle == NULL) { result = FALSE; goto exit; } gdFsGetFileSize( sndgDatWrk.m_MltGdfsHandle, &file_sz); file_sct_sz = gdFsCalcSctSize( file_sz); sdMemBlkSetPrm( sndgDatWrk.m_MltMemblkHandle, sndgDatWrk.m_MltBufPtr, sndgDatWrk.m_MltBufSz, SDD_MEMBLK_SYNC_FUNC, NULL); /* * 実際の読み込み */ for ( read_sct_num = 0; read_sct_num < file_sct_sz; read_sct_num += read_buf_sct_sz) { Sint32 gdfs_lib_result; SDE_MEMBLK_STAT stat; gdfs_lib_result = gdFsRead( sndgDatWrk.m_MltGdfsHandle, read_buf_sct_sz, sndgDatWrk.m_MltBufPtr); if ( sdMltDownloadEx( sndgDatWrk.m_MltMemblkHandle) != SDE_ERR_NOTHING) { result = FALSE; goto exit; } do { if ( sdMemBlkGetStat( sndgDatWrk.m_MltMemblkHandle, &stat) != SDE_ERR_NOTHING) { result = FALSE; goto exit; } } while ( stat != SDE_MEMBLK_STAT_TRANSFER_FINISHED); } exit: if ( sndgDatWrk.m_MltGdfsHandle != NULL) gdFsClose( sndgDatWrk.m_MltGdfsHandle); return result; }
基本的な引数や動作の仕様はsdMltDownload()関数と同様です。この関数でSDE_ERR_BANK_ILLEGAL_CHECK_SUMが返ってきた場合Bankファイル作成時に記録されたチェクサムと実際にダウンロードした内容のチェクサムが合わなかったことを表します。 この場合Bankファイルが壊れている可能性がありますので、サウンドクリエーターに確認してください。
Bankのダウンロードを行う場合、その時点で各種音源(MIDI音源・One Shot音源・PCM Stream音源・GD-DA音源)で再生している音に関係あるBankを更新しないようにしてください。 例えばOne Shot Bank番号0番・One Shot Data番号0番を再生している時に、One Shot Bank番号0番を更新すると再生中の波形が破壊されることになり、ノイズが発生します。 この場合、それぞれの該当音源ポートの再生を停止する処置(sdMidiSeqStop()関数・sdShotStop()関数など)を取ってください。 また、Host Commandのバッファリング等の関係から、停止処理を行った後数V同期割り込み分待ったうえでダウンロードを行う方が安全です。
この関数を使用する時にはFXはsdSndClearFxPrg()関数で使用しないようにしてください。
sdMltDownload() Multi Unitの転送 sdBankDownloadSetDivSz() BankのDMA転送時の分割サイズの指定 sdSndClearFxPrg() FX Programのクリア