view sound.c @ 30:427e1aac0bd7

not run.
author koba <koba@cr.ie.u-ryukyu.ac.jp>
date Fri, 31 Dec 2010 15:50:44 +0900
parents 00c3272a801f
children
line wrap: on
line source

#include <stdio.h>
#include <SDL.h>
#include <SDL_mixer.h> //追加
#include "sound.h"
#include "Ss.h"

#include "error.h"
//#include "libps.h"

//int vh_addr[10]={0x80140000,0x80141a00,0x80143000,0x80144400,0x80148200,
//               0x80149300,0x8014f300,0x80130000,0x80130000,0x80130000};

//_________________________________________________________
Mix_Chunk *chunk[8]; // 音楽ファイルの読み込み変数
int channel[8];
//_________________________________________________________

#if 0
static char buf0[] = "pBAV";

long vh_addr[10] =
{ (long) buf0, (long) buf0, (long) buf0, (long) buf0, (long) buf0,
  (long) buf0 };
#endif

int vb_addr[10] =
{ 0x80140d00, 0x80142700, 0x80143d00, 0x80145100, 0x80148f00,
  0x8014a100, 0x80150000, 0x80140000, 0x80140000, 0x80140000
};

int vab[10];			/* SE 用 VAB */
unsigned char *buf;
int cnt;
int seqno = -1;

int seq[4];			/* SEQ data id */
int sdvab;			/* 常駐 SE.VAB */

//CdlFILE vhfile, vbfile;

int SQ[10] = { 0x80155000, 0x8015f000, 0x80168000, 0x8016e000, 0x80175000,
	       0x80177000, 0xa00d0000, 0xa00e0000, 0x801e0000
};

void Soundss()
{
    /*
      int i;

      //Set Sound Reverb @@@  リバーブの設定 
      printf("音源データをCDから読み込み中");
      SsUtSetReverbType(SS_REV_TYPE_STUDIO_C);
      SsUtReverbOn();


      // 音源データのCDからの読み込み 
      // 標準音源(VH属性部)の読み込み 
      for (i = 0; i < 10; i++) {	// リトライループ 
      if (CdSearchFile(&vhfile, VH_NAME) != 0)
      break;		//正常終了ならばリトライループ中断 
      else
      printf("%s not found.\n", VH_NAME);
      }
      printf("♪");
      for (i = 0; i < 10; i++) {	// リトライループ 
      CdReadFile(VH_NAME, (void *) SQVH_ADDR, vhfile.size);

      // リードの裏で通常の処理は実行できる。
      // ここでは、Read が終了するまで残りのセクタ数を監視 
      while ((cnt = CdReadSync(1, 0)) > 0)
      VSync(0);		// 垂直同期割り込み待ち(時間調整用)
      if (cnt == 0)
      break;		// 正常終了ならばリトライループ中断 
      }
      // 標準音源(VB波形部)の読み込み 
      for (i = 0; i < 10; i++) {	// リトライループ 
      if (CdSearchFile(&vbfile, VB_NAME) != 0)
      break;		// 正常終了ならばリトライループ中断 
      else
      printf("%s not found.\n", VB_NAME);
      }
      printf("♪");
      for (i = 0; i < 10; i++) {	// リトライループ 
      CdReadFile(VB_NAME, (void *) SQVB_ADDR, vbfile.size);

      // リードの裏で通常の処理は実行できる。
      // ここでは、Read が終了するまで残りのセクタ数を監視 
      while ((cnt = CdReadSync(1, 0)) > 0)
      VSync(0);		// 垂直同期割り込み待ち(時間調整用)

      if (cnt == 0)
      break;		// 正常終了ならばリトライループ中断 
      }
      printf("♪");
      // Open & transfer VAB data @@@ *VAB データのオープン,転送 
      sdvab = SsVabTransfer(SQVH_ADDR, SQVB_ADDR, -1, 1);
      if (sdvab < 0) {
      printf("VAB open failed(sdvab = %d)\n", sdvab);
      return;
      }
      printf("完了。\n");
      //      seq[0] = SsSeqOpen (SQ_ADDR, sdvab);
      //      for (i=0;i<8;i++)
      //      seq[i] = SsSeqOpen ((unsigned long*)SQ[i], sdvab);
      */
}

void SoundPlay(int no)
{
    // Open SEQ/SEP datas @@@ * SEQ/SEP データのオープン 
    //    SsSetMVol (127, 127);
    //    SsUtSetReverbDepth( 40, 40 );

    seq[no] = SsSeqOpen((unsigned int *) SQ[no], sdvab);
    seqno = no;
    //SsSeqPlay(seq[no], SSPLAY_PLAY, 0);

}

void SoundStop()
{
    if (seqno == -1)
	return;
    //SsSeqStop(seq[seqno]);
    //SsSeqClose(seq[seqno]);
}

//__________________________________________________________________
/**
 * 全部これで判定するのはおかしい。
 * んだけど、時間がががががが
 */
int no_useSDLMixer = 0;

void
InitSdlMixer(void)
{
    if (Mix_OpenAudio(MIX_DEFAULT_FREQUENCY,MIX_DEFAULT_FORMAT,2,1024) < 0) {
        __debug("failed to initialize SDL_mixer.\n");
	no_useSDLMixer = 1;
    }
}


// 音楽ファイル読み込み関数
void LoadSdlMixer()
{
    if (no_useSDLMixer) {
	__debug("%s is not executed because no_useSDLMixer is set\n",
		__FUNCTION__);
    } else {
	chunk[BGM]=Mix_LoadWAV("./sound/sample.wav");
	chunk[SHOT_A]=Mix_LoadWAV("./sound/shota.wav");
	chunk[SHOT_B]=Mix_LoadWAV("./sound/shotb.wav");
	chunk[SHOT_C]=Mix_LoadWAV("./sound/shotc.wav");
	chunk[RING]=Mix_LoadWAV("./sound/ring.wav");
	chunk[NEW]=Mix_LoadWAV("./sound/powerdown.wav");
	chunk[JIKIOUT]=Mix_LoadWAV("./sound/jikiout.wav");
	chunk[BOM]=Mix_LoadWAV("./sound/bomber.wav");
	
	// 読み込めないファイルがあればエラーで終了
	if(!chunk[BGM] || !chunk[SHOT_A] || !chunk[SHOT_B] || !chunk[SHOT_C]
	   ||!chunk[RING] || !chunk[NEW] || !chunk[JIKIOUT] || !chunk[BOM]) {
	    fprintf(stderr,"failed to load sound.\n");
	    //return -1;
	    return;
	}
    }
}

/* 音楽再生関数
   int fleg ... 再生回数。-1でループします。
   int ch ... 再生する音の番号*/
void
PlaySdlMixer(int fleq, int ch)
{
    if (no_useSDLMixer) {
	__debug("%s is not executed because no_useSDLMixer is set\n",
		__FUNCTION__);
    } else {
	channel[ch]=Mix_PlayChannel( ch ,chunk[ch], fleq);
    }
}

void
PauseSdlMixer(int ch)
{
    if (no_useSDLMixer) {
	__debug("%s is not executed because no_useSDLMixer is set\n",
		__FUNCTION__);
    } else {
	Mix_Pause(ch);
    }
}

void
ResumeSdlMixer(int ch)
{
    if (no_useSDLMixer) {
	__debug("%s is not executed because no_useSDLMixer is set\n",
		__FUNCTION__);
    } else {
	Mix_Resume(ch);
    }
}

void
TimeSdlMixer(int fleq, int ch, int time)
{
    if (no_useSDLMixer) {
	__debug("%s is not executed because no_useSDLMixer is set\n",
		__FUNCTION__);
    } else {
	channel[ch]=Mix_PlayChannelTimed( ch ,chunk[ch], fleq, time);
    }
}


// 音の解放関数
void
FreeSdlMixer()
{
    int i ;

    if (no_useSDLMixer) {
	__debug("%s is not executed because no_useSDLMixer is set\n",
		__FUNCTION__);
    } else {
	for(i =0; i < 8; ++i) {
	    Mix_FreeChunk(chunk[i]);
	}
    }
}

void
InitVolume(void)
{
    if (no_useSDLMixer) {
	__debug("%s is not executed because no_useSDLMixer is set\n",
		__FUNCTION__);
    } else {
	Mix_Volume( 0, 255);       // BGM
	Mix_Volume( 1, SE_VOLUME); // SHOT_A
	Mix_Volume( 2, SE_VOLUME); // SHOT_B
	Mix_Volume( 3, 100);       // SHOT_C
	Mix_Volume( 4, 40);        // RING
	Mix_Volume( 5, SE_VOLUME); // NEW
	Mix_Volume( 6, SE_VOLUME); // JIKIOUT
	Mix_Volume( 7, 100);       // BOM
    }
}

//_________________________________________________________________