##### 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