nuausndplayerplay.c 2.1 KB
/*======================================================================*/
/*		NuSYS							*/
/*		nuausndplayerplay.c					*/
/*									*/
/*		Copyright (C) 1997, NINTENDO Co,Ltd.			*/
/*									*/
/*======================================================================*/
/* $Id: nuausndplayerplay.c,v 1.1.1.1 2002/10/30 02:07:09 blythe Exp $*/
/*======================================================================*/

#include <nusys.h>
#include <nualsgi.h>


/*----------------------------------------------------------------------*/
/*	nuAuSndPlayerPlay -サウンドの再生				*/
/*	IN:	sndNo 再生するサウンドの番号				*/
/*	RET:	対象サウンドのID					*/
/*		-1 = 再生出来なかった					*/
/*----------------------------------------------------------------------*/
ALSndId nuAuSndPlayerPlay(u32 sndNo)
{

    ALBank*	bank_ptr;
    ALInstrument* inst;
    u32		cnt;

    bank_ptr  = nuAuSndBank_ptr->bankArray[0];
    inst      = bank_ptr->instArray[0];
    
#ifdef NU_DEBUG
    /*	サウンド数のチェック */
    if(inst->soundCount <= sndNo){
	osSyncPrintf("nuAuSndPlayerPlay: sndNo %d is too big.\n", sndNo);
	return -1;
    }
#endif /* NU_DEBUG */
    /* nuAuSndId テーブルを検索し、使っていない項目を探す */
    for(cnt = 0; cnt < nuAuSndPlayer.maxSounds; cnt++){	
      if(nuAuSndId[cnt] == -1)
	break;
      else
	{
	  /* 使っていないサウンドなら抹消し、その番号を使う */
	  alSndpSetSound(&nuAuSndPlayer,nuAuSndId[cnt]);
	  if(alSndpGetState(&nuAuSndPlayer) == AL_STOPPED)
	    {
	      alSndpDeallocate(&nuAuSndPlayer,nuAuSndId[cnt]);
	      nuAuSndId[cnt] = -1; /* この行もほんとは要らない */
	      break;
	    }
	}
    }

    /* テーブルに空きが無かったらエラーを返す */
    if(cnt == nuAuSndPlayer.maxSounds)
      return(-1);

    /* 再生するサウンドを登録する */
    nuAuSndId[cnt] = alSndpAllocate(&nuAuSndPlayer,inst->soundArray[sndNo]);

    /* 登録出来た場合のみ再生する。
       (この場合、登録は必ずできるはずだが念のためチェック)
       再生出来なかった場合 エラー を返す */

    if(nuAuSndId[cnt] != -1)
      {
	alSndpSetSound(&nuAuSndPlayer,nuAuSndId[cnt]);
	alSndpPlay(&nuAuSndPlayer);	
      }
    return nuAuSndId[cnt];
}