Sound Library - データユーティリティ関数

sdMltDownloadEx

Multi Unitの分割転送

書式

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のクリア

sdMltDownloadEx
COPYRIGHT © SEGA ENTERPRISES, LTD., 1998-2000