예제 #1
0
파일: sound.c 프로젝트: dafyddcrosby/meka
// Initialize Sound Card ------------------------------------------------------
static  int     Sound_Init_SoundCard (void)
{
  int            i;
  AUDIOINFO      Audio_Infos;

  ConsolePrintf (Msg_Get (MSG_Sound_Init_Soundcard), Sound.SampleRate);
  ConsolePrint ("\n");

  Audio_Infos.nDeviceId = Sound.SoundCard;
  Audio_Infos.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO; // FIXME: Stereo ?
  Audio_Infos.nSampleRate = audio_sample_rate = Sound.SampleRate;

  if (AOpenAudio(&Audio_Infos) != AUDIO_ERROR_NONE)
     {
     Quit_Msg ("%s", Msg_Get (MSG_Sound_Init_Error_Audio));
     return (MEKA_ERR_FAIL);
     }
  // FIXME: original sound engine was trying different sample rate on failure

  // Unused
  // Maybe it was intended to check out number of channels there ?
  // AGetAudioCaps (Audio_Infos.nDeviceId, &Audio_Caps);

  // Open voices
  if (AOpenVoices(Sound.Voices_Max) != AUDIO_ERROR_NONE)
     {
     Quit_Msg ("%s", Msg_Get (MSG_Sound_Init_Error_Voices));
     return (MEKA_ERR_FAIL);
     }

  ASetAudioMixerValue (AUDIO_MIXER_MASTER_VOLUME, 256);

  // Allocate voices and waveforms
  Sound.Voices = Memory_Alloc (sizeof (t_voice) * Sound.Voices_Max);
  for (i = 0; i < Sound.Voices_Max; i++)
     {
     if (ACreateAudioVoice(&Sound.Voices[i].hVoice) != AUDIO_ERROR_NONE)
        {
        Quit_Msg (Msg_Get (MSG_Sound_Init_Error_Voice_N), i);
        return (MEKA_ERR_FAIL);
        }
     ASetVoicePanning(Sound.Voices[i].hVoice, 128); // Center voice
     Sound.Voices[i].lpWave  = NULL;
     Sound.Voices[i].playing = FALSE;
     }

  // FIXME: is this needed ?
  AUpdateAudio ();

  // FIXME: is this needed ?
  // Check frame sample rate
  audio_sample_rate = nominal_sample_rate = Audio_Infos.nSampleRate;

  return (MEKA_ERR_OK);
}
예제 #2
0
int main(void)
{
    AUDIOINFO info;
    LPAUDIOMODULE lpModule;
    LPAUDIOWAVE lpWave;
    HAC hVoice;
    BOOL stopped;

    /* initialize audio library */
    AInitialize();

    /* open audio device */
    info.nDeviceId = AUDIO_DEVICE_MAPPER;
    info.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO;
    info.nSampleRate = 44100;
    AOpenAudio(&info);

    /* load module and waveform file */
    ALoadModuleFile("test.s3m", &lpModule, 0);
    ALoadWaveFile("test.wav", &lpWave, 0);

    /* open voices for module and waveform */
    AOpenVoices(lpModule->nTracks + 1);

    /* play the module file */
    APlayModule(lpModule);
    ASetModuleVolume(64);

    /* play the waveform through a voice */
    ACreateAudioVoice(&hVoice);
    APlayVoice(hVoice, lpWave);
    ASetVoiceVolume(hVoice, 48);
    ASetVoicePanning(hVoice, 128);

    /* program main execution loop */
    printf("Playing module and waveform, press any key to stop.\n");
    while (!kbhit()) {
        /* update audio system */
        AUpdateAudio();

        /* restart waveform if stopped */
        AGetVoiceStatus(hVoice, &stopped);
        if (stopped) APlayVoice(hVoice, lpWave);

        /* check if the module is stopped */
        AGetModuleStatus(&stopped);
        if (stopped) break;
    }

    /* stop playing the waveform */
    AStopVoice(hVoice);
    ADestroyAudioVoice(hVoice);

    /* stop playing the module */
    AStopModule();
    ACloseVoices();

    /* release the waveform & module */
    AFreeWaveFile(lpWave);
    AFreeModuleFile(lpModule);

    /* close audio device */
    ACloseAudio();
    return 0;
}
예제 #3
0
파일: SEALINTF.C 프로젝트: kidaa/Provenance
int msdos_init_sound(int *rate, int card)
{
  int i;

  seal_sample_rate = *rate;
  seal_sound_card  = card;

  if (AInitialize() != AUDIO_ERROR_NONE)
    return 1;

  /* Ask the user if no sound card was chosen */
  if (seal_sound_card == -1)
  {
    unsigned int k;

    printf("\n SELECT YOUR AUDIO DEVICE :\n\n"
            " AWE32/64 playback requires onboard DRAM,\n"
            " Sound Blaster playback is the most compatible & better for emulation\n\n");

    for (k = 0;k < AGetAudioNumDevs();k++)
    {
      if (AGetAudioDevCaps(k,&caps) == AUDIO_ERROR_NONE)
        printf("  %2d. %s\n",k,caps.szProductName);
    }
    printf("\n");

    if (k < 10)
    {
      i = getch();
      seal_sound_card = i - '0';
    }
    else
      scanf("%d",&seal_sound_card);
  }

  /* initialize SEAL audio library */
  if (seal_sound_card == 0)     /* silence */
  {
    /* update the Machine structure to show that sound is disabled */
    seal_sample_rate = 0;
    exit(0);
    return 0;
  }

  /* open audio device */
  /* info.nDeviceId = AUDIO_DEVICE_MAPPER;*/
  info.nDeviceId = seal_sound_card;
  /* always use 16 bit mixing if possible - better quality and same speed of 8 bit */
  info.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO | AUDIO_FORMAT_RAW_SAMPLE;

  info.nSampleRate = seal_sample_rate;
  if (AOpenAudio(&info) != AUDIO_ERROR_NONE)
  {
    return (1);
  }

  AGetAudioDevCaps(info.nDeviceId,&caps);
  printf("Using `%s' at %d-bit %s %u Hz\n",
  caps.szProductName,
  info.wFormat & AUDIO_FORMAT_16BITS ? 16 : 8,
  info.wFormat & AUDIO_FORMAT_STEREO ? "stereo" : "mono",
  info.nSampleRate);

  /* open and allocate voices, allocate waveforms */
  if (AOpenVoices(NUMVOICES) != AUDIO_ERROR_NONE)
  {
    printf("voices initialization failed\n");
    return 1;
  }

  for (i = 0; i < NUMVOICES; i++)
  {
    if (ACreateAudioVoice(&hVoice[i]) != AUDIO_ERROR_NONE)
    {
      printf("voice #%d creation failed\n",i);
      return 1;
    }

    ASetVoicePanning(hVoice[i],128);

    lpWave[i] = 0;
  }

  /* update the Machine structure to reflect the actual sample rate */
  *rate = seal_sample_rate = info.nSampleRate;

  {
    uclock_t a,b;
    LONG start,end;


    if ((lpWave[0] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0)
      return 1;

    lpWave[0]->wFormat = AUDIO_FORMAT_8BITS | AUDIO_FORMAT_MONO;
    lpWave[0]->nSampleRate = seal_sample_rate;
    lpWave[0]->dwLength = 3*seal_sample_rate;
    lpWave[0]->dwLoopStart = 0;
    lpWave[0]->dwLoopEnd = 3*seal_sample_rate;
    if (ACreateAudioData(lpWave[0]) != AUDIO_ERROR_NONE)
    {
      free(lpWave[0]);
      lpWave[0] = 0;

      return 1;
    }

    memset(lpWave[0]->lpData,0,3*seal_sample_rate);
    /* upload the data to the audio DRAM local memory */
    AWriteAudioData(lpWave[0],0,3*seal_sample_rate);
    APrimeVoice(hVoice[0],lpWave[0]);
    ASetVoiceFrequency(hVoice[0],seal_sample_rate);
    ASetVoiceVolume(hVoice[0],0);
    AStartVoice(hVoice[0]);

    a = uclock();
    /* wait some time to let everything stabilize */
    do
    {
      osd_update_audio();
      b = uclock();
    } while (b-a < UCLOCKS_PER_SEC/10);

    a = uclock();
    AGetVoicePosition(hVoice[0],&start);
    do
    {
      osd_update_audio();
      b = uclock();
    } while (b-a < UCLOCKS_PER_SEC);
    AGetVoicePosition(hVoice[0],&end);

    nominal_sample_rate = seal_sample_rate;
    seal_sample_rate = end - start;

    AStopVoice(hVoice[0]);
    ADestroyAudioData(lpWave[0]);
    free(lpWave[0]);
    lpWave[0] = 0;
  }

  osd_set_mastervolume(0);    /* start at maximum volume */

  return 0;
}
예제 #4
0
파일: SEALINTF.C 프로젝트: kidaa/Provenance
void playstreamedsample(int channel,signed char *data,int len,int freq,int volume,int pan,int bits)
{
  static int playing[NUMVOICES];
  static int c[NUMVOICES];

  /* backwards compatibility with old 0-255 volume range */
  if (volume > 100) volume = volume * 25 / 255;

  if (seal_sample_rate == 0 || channel >= NUMVOICES) return;

  if (!playing[channel])
  {
    if (lpWave[channel])
    {
      AStopVoice(hVoice[channel]);
      ADestroyAudioData(lpWave[channel]);
      free(lpWave[channel]);
      lpWave[channel] = 0;
    }

    if ((lpWave[channel] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0)
      return;

    lpWave[channel]->wFormat = (bits == 8 ? AUDIO_FORMAT_8BITS : AUDIO_FORMAT_16BITS)
        | AUDIO_FORMAT_MONO | AUDIO_FORMAT_LOOP;
    lpWave[channel]->nSampleRate = nominal_sample_rate;
    lpWave[channel]->dwLength = 3*len;
    lpWave[channel]->dwLoopStart = 0;
    lpWave[channel]->dwLoopEnd = 3*len;
    if (ACreateAudioData(lpWave[channel]) != AUDIO_ERROR_NONE)
    {
      free(lpWave[channel]);
      lpWave[channel] = 0;
      return;
    }

    memset(lpWave[channel]->lpData,0,3*len);
    memcpy(lpWave[channel]->lpData,data,len);

    /* upload the data to the audio DRAM local memory */
    AWriteAudioData(lpWave[channel],0,3*len);
    APrimeVoice(hVoice[channel],lpWave[channel]);

    /* need to cast to double because freq*nominal_sample_rate can exceed the size of an int */
    ASetVoiceFrequency(hVoice[channel],(double)freq*nominal_sample_rate/seal_sample_rate);
    AStartVoice(hVoice[channel]);
    playing[channel] = 1;
    c[channel] = 1;
  }
  else
  {
    LONG pos;

    for(;;)
    {
      AGetVoicePosition(hVoice[channel],&pos);
      if (c[channel] == 0 && pos >= len) break;
      if (c[channel] == 1 && (pos < len || pos >= 2*len)) break;
      if (c[channel] == 2 && pos < 2*len) break;
      osd_update_audio();
    }

    memcpy(&lpWave[channel]->lpData[len * c[channel]],data,len);
    AWriteAudioData(lpWave[channel],len*c[channel],len);
    c[channel]++;
    if (c[channel] == 3) c[channel] = 0;
  }

  ASetVoiceVolume(hVoice[channel],volume * 64 / 100);
  ASetVoicePanning(hVoice[channel],(pan + 100) * 255 / 200);
}
예제 #5
0
int main(void)
{
    AUDIOINFO info;
    LPAUDIOWAVE lpWave;
    HAC hVoice[NUMVOICES];
    BOOL stopped;
    UINT n, m;

    /* initialize audio library */
    AInitialize();

    /* open audio device */
    info.nDeviceId = AUDIO_DEVICE_MAPPER;
    info.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO;
    info.nSampleRate = 44100;
    AOpenAudio(&info);

    /* load waveform file */
    ALoadWaveFile("test.wav", &lpWave, 0);

    /* open and allocate voices */
    AOpenVoices(NUMVOICES);
    for (n = 0; n < NUMVOICES; n++) {
        ACreateAudioVoice(&hVoice[n]);
        ASetVoiceVolume(hVoice[n], 64);
        ASetVoicePanning(hVoice[n], n & 1 ? 0 : 255);
    }

    /* program main execution loop */
    printf("Playing waveform, press any key to stop.\n");
    for (n = m = 0; !kbhit() && n < 48 - 7; n++) {
        /* play chord C-E-G */
        APlayVoice(hVoice[m+0], lpWave);
        APlayVoice(hVoice[m+1], lpWave);
        APlayVoice(hVoice[m+2], lpWave);
        ASetVoiceFrequency(hVoice[m+0], FREQ(aPeriodTable[n+0]));
        ASetVoiceFrequency(hVoice[m+1], FREQ(aPeriodTable[n+4]));
        ASetVoiceFrequency(hVoice[m+2], FREQ(aPeriodTable[n+7]));
        m = (m + 3) % NUMVOICES;

        /* wait until note finishes */
        do {
            /* update audio system */
            AUpdateAudio();
            AGetVoiceStatus(hVoice[0], &stopped);
        } while (!stopped);
    }

    /* stop and release voices */
    for (n = 0; n < NUMVOICES; n++) {
        AStopVoice(hVoice[n]);
        ADestroyAudioVoice(hVoice[n]);
    }
    ACloseVoices();

    /* release the waveform file */
    AFreeWaveFile(lpWave);

    /* close audio device */
    ACloseAudio();
    return 0;
}
예제 #6
0
int osd_start_audio_stream(int stereo)
{
#ifdef USE_SEAL
	int channel;
#endif

	if (stereo) stereo = 1;	/* make sure it's either 0 or 1 */

	stream_cache_stereo = stereo;

	/* determine the number of samples per frame */
	samples_per_frame = (double)Machine->sample_rate / (double)Machine->drv->frames_per_second;

	/* compute how many samples to generate this frame */
	samples_left_over = samples_per_frame;
	samples_this_frame = (UINT32)samples_left_over;
	samples_left_over -= (double)samples_this_frame;

	audio_buffer_length = NUM_BUFFERS * samples_per_frame + 20;


	if (Machine->sample_rate == 0) return 0;

#ifdef USE_SEAL
	for (channel = 0;channel <= stereo;channel++)
	{
		if (ACreateAudioVoice(&hVoice[channel]) != AUDIO_ERROR_NONE)
			return 0;

		if ((lpWave[channel] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0)
		{
			ADestroyAudioVoice(hVoice[channel]);
			return 0;
		}

		lpWave[channel]->wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_MONO | AUDIO_FORMAT_LOOP;
		lpWave[channel]->nSampleRate = nominal_sample_rate;
		lpWave[channel]->dwLength = 2*audio_buffer_length;
		lpWave[channel]->dwLoopStart = 0;
		lpWave[channel]->dwLoopEnd = lpWave[channel]->dwLength;
		if (ACreateAudioData(lpWave[channel]) != AUDIO_ERROR_NONE)
		{
			free(lpWave[channel]);
			lpWave[channel] = 0;

			return 0;
		}

		memset(lpWave[channel]->lpData,0,lpWave[channel]->dwLength);
		APrimeVoice(hVoice[channel],lpWave[channel]);
		ASetVoiceFrequency(hVoice[channel],nominal_sample_rate);
	}

	if (stereo)
	{
		/* SEAL doubles volume for panned channels, so we have to compensate */
		ASetVoiceVolume(hVoice[0],32);
		ASetVoiceVolume(hVoice[1],32);

		ASetVoicePanning(hVoice[0],0);
		ASetVoicePanning(hVoice[1],255);

		AStartVoice(hVoice[0]);
		AStartVoice(hVoice[1]);
	}
	else
	{
		ASetVoiceVolume(hVoice[0],64);
		ASetVoicePanning(hVoice[0],128);
		AStartVoice(hVoice[0]);
	}
#endif

#ifdef USE_ALLEGRO
	mysample = create_sample(16,stereo,nominal_sample_rate,audio_buffer_length);
	if (mysample == 0) return 0;
	myvoice = allocate_voice(mysample);
	voice_set_playmode(myvoice,PLAYMODE_LOOP);
	if (stereo)
	{
		INT16 *buf = mysample->data;
		int p = 0;
		while (p != audio_buffer_length)
		{
			buf[2*p] = (INT16)0x8000;
			buf[2*p+1] = (INT16)0x8000;
			p++;
		}
	}
	else
	{
		INT16 *buf = mysample->data;
		int p = 0;
		while (p != audio_buffer_length)
		{
			buf[p] = (INT16)0x8000;
			p++;
		}
	}
	voice_start(myvoice);
#endif

	stream_playing = 1;
	voice_pos = 0;

	return samples_this_frame;
}