Example #1
0
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);
}
Example #2
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;
}
Example #3
0
int msdos_init_sound(void)
{
#ifdef USE_SEAL
	int i;

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

		printf("\nSelect the audio device:\n");

		for (k = 0;k < AGetAudioNumDevs();k++)
		{
			/* don't show the AWE32, it's too slow, users must choose Sound Blaster */
			if (AGetAudioDevCaps(k,&caps) == AUDIO_ERROR_NONE &&
					strcmp(caps.szProductName,"Sound Blaster AWE32"))
				printf("  %2d. %s\n",k,caps.szProductName);
		}
		printf("\n");

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

	/* initialize SEAL audio library */
	if (soundcard == 0)     /* silence */
	{
		/* update the Machine structure to show that sound is disabled */
		Machine->sample_rate = 0;
		return 0;
	}

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

	/* use stereo output if supported */
	if (usestereo)
	{
		if (Machine->drv->sound_attributes & SOUND_SUPPORTS_STEREO)
			info.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO | AUDIO_FORMAT_RAW_SAMPLE;
	}

	info.nSampleRate = Machine->sample_rate;
	if (AOpenAudio(&info) != AUDIO_ERROR_NONE)
	{
		printf("audio initialization failed\n");
		return 1;
	}

	AGetAudioDevCaps(info.nDeviceId,&caps);
	logerror("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(SOUND_CHANNELS) != AUDIO_ERROR_NONE)
	{
		printf("voices initialization failed\n");
		return 1;
	}

	for (i = 0; i < SOUND_CHANNELS; i++)
	{
		lpWave[i] = 0;
	}

	stream_playing = 0;
	stream_cache_data = 0;
	stream_cache_len = 0;
	stream_cache_stereo = 0;

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

	logerror("set sample rate: %d\n",Machine->sample_rate);
	if (sampleratedetect)
	{
		TICKER a,b;
		LONG start,end;


		if (ACreateAudioVoice(&hVoice[0]) != AUDIO_ERROR_NONE)
			return 1;

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

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

			return 1;
		}

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

		a = ticker();
		/* wait some time to let everything stabilize */
		do
		{
			AUpdateAudioEx(Machine->sample_rate / Machine->drv->frames_per_second);
			b = ticker();
		} while (b-a < TICKS_PER_SEC/10);

		a = ticker();
		AGetVoicePosition(hVoice[0],&start);
		do
		{
			AUpdateAudioEx(Machine->sample_rate / Machine->drv->frames_per_second);
			b = ticker();
		} while (b-a < TICKS_PER_SEC);
		AGetVoicePosition(hVoice[0],&end);
		nominal_sample_rate = Machine->sample_rate;
		Machine->sample_rate = end - start;
		logerror("actual sample rate: %d\n",Machine->sample_rate);

		AStopVoice(hVoice[0]);
		ADestroyAudioData(lpWave[0]);
		free(lpWave[0]);
		lpWave[0] = 0;
		ADestroyAudioVoice(hVoice[0]);
	}
	else
		nominal_sample_rate = Machine->sample_rate;

#if 0
	{
		char *blaster_env;
		/* Get Soundblaster base address from environment variabler BLASTER   */
		/* Soundblaster OPL base port, at some compatibles this must be 0x388 */

		if(!getenv("BLASTER"))
		{
			printf("\nBLASTER variable not found, disabling fm sound!\n");
                        No_OPL = options.no_fm = 1;
		}
		else
		{
			blaster_env = getenv("BLASTER");
			BaseSb = i = 0;
			while ((blaster_env[i] & 0x5f) != 0x41) i++;        /* Look for 'A' char */
			while (blaster_env[++i] != 0x20) {
				BaseSb = (BaseSb << 4) + (blaster_env[i]-0x30);
			}
		}
	}
#endif

#endif

#ifdef USE_ALLEGRO
	reserve_voices(1,0);
	if (install_sound(DIGI_AUTODETECT,MIDI_NONE,0) != 0)
	{
		logerror("Allegro install_sound error: %s\n",allegro_error);
		return 1;
	}

	nominal_sample_rate = Machine->sample_rate;
#endif

	num_used_opl = 0;

	osd_set_mastervolume(attenuation);	/* set the startup volume */

	return 0;
}
Example #4
0
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;
}