void osd_stop_audio_stream(void) { #ifdef USE_SEAL int i; #endif if (Machine->sample_rate == 0) return; #ifdef USE_SEAL /* stop and release voices */ for (i = 0;i < SOUND_CHANNELS;i++) { if (lpWave[i]) { AStopVoice(hVoice[i]); ADestroyAudioData(lpWave[i]); free(lpWave[i]); lpWave[i] = 0; ADestroyAudioVoice(hVoice[i]); } } #endif #ifdef USE_ALLEGRO voice_stop(myvoice); deallocate_voice(myvoice); destroy_sample(mysample); mysample = 0; #endif stream_playing = 0; }
void msdos_shutdown_sound(void) { if (seal_sample_rate != 0) { int n; /* stop and release voices */ for (n = 0; n < NUMVOICES; n++) { AStopVoice(hVoice[n]); ADestroyAudioVoice(hVoice[n]); if (lpWave[n]) { ADestroyAudioData(lpWave[n]); free(lpWave[n]); lpWave[n] = 0; } } ACloseVoices(); ACloseAudio(); } }
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; }
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; }
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; }
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; }