int osd_update_audio_stream(INT16 *buffer) { // if nothing to do, don't do it if (stream_buffer) { int original_bytes = bytes_in_stream_buffer(); int input_bytes = samples_this_frame * stream_format.nBlockAlign; int final_bytes; // update the sample adjustment update_sample_adjustment(original_bytes); // copy data into the sound buffer copy_sample_data(buffer, input_bytes); // check for overflows final_bytes = bytes_in_stream_buffer(); if (final_bytes < original_bytes) buffer_overflows++; } if( wavptr != NULL ) wav_add_data_16( wavptr, buffer, samples_this_frame * 2 ); // reset underflow/overflow tracking if (++total_frames == INGORE_UNDERFLOW_FRAMES) buffer_overflows = buffer_underflows = 0; // update underflow/overflow logging #if (DISPLAY_UNDEROVERFLOW || LOG_SOUND) { static int prev_overflows, prev_underflows; if (total_frames > INGORE_UNDERFLOW_FRAMES && (buffer_overflows != prev_overflows || buffer_underflows != prev_underflows)) { prev_overflows = buffer_overflows; prev_underflows = buffer_underflows; #if DISPLAY_UNDEROVERFLOW popmessage("overflows=%d underflows=%d", buffer_overflows, buffer_underflows); #endif #if LOG_SOUND fprintf(sound_log, "************************ overflows=%d underflows=%d\n", buffer_overflows, buffer_underflows); #endif } } #endif // determine the number of samples per frame samples_per_frame = (double)Machine->sample_rate / (double)Machine->screen[0].refresh; // compute how many samples to generate next frame samples_left_over += samples_per_frame; samples_this_frame = (UINT32)samples_left_over; samples_left_over -= (double)samples_this_frame; samples_this_frame += current_adjustment; // return the samples to play this next frame return samples_this_frame; }
void windows_osd_interface::update_audio_stream(const INT16 *buffer, int samples_this_frame) { int bytes_this_frame = samples_this_frame * stream_format.nBlockAlign; DWORD play_position, write_position; HRESULT result; // if no sound, there is no buffer if (stream_buffer == NULL) return; #ifdef USE_AUDIO_SYNC // if we are active, update the sampling frequency if (audio_sync && machine().video().speed_percent() > 0.0f) { IDirectSoundBuffer_SetFrequency(stream_buffer, machine().sample_rate() * machine().video().speed_percent()); } #endif /* USE_AUDIO_SYNC */ // determine the current play position result = IDirectSoundBuffer_GetCurrentPosition(stream_buffer, &play_position, &write_position); if (result == DS_OK) { DWORD stream_in; //DWORD orig_write = write_position; // normalize the write position so it is always after the play position if (write_position < play_position) write_position += stream_buffer_size; // normalize the stream in position so it is always after the write position stream_in = stream_buffer_in; if (stream_in < write_position) stream_in += stream_buffer_size; // now we should have, in order: // <------pp---wp---si---------------> // if we're between play and write positions, then bump forward, but only in full chunks while (stream_in < write_position) { //printf("Underflow: PP=%d WP=%d(%d) SI=%d(%d) BTF=%d\n", (int)play_position, (int)write_position, (int)orig_write, (int)stream_in, (int)stream_buffer_in, (int)bytes_this_frame); buffer_underflows++; stream_in += bytes_this_frame; } // if we're going to overlap the play position, just skip this chunk if (stream_in + bytes_this_frame > play_position + stream_buffer_size) { //printf("Overflow: PP=%d WP=%d(%d) SI=%d(%d) BTF=%d\n", (int)play_position, (int)write_position, (int)orig_write, (int)stream_in, (int)stream_buffer_in, (int)bytes_this_frame); buffer_overflows++; return; } // now we know where to copy; let's do it stream_buffer_in = stream_in % stream_buffer_size; copy_sample_data(buffer, bytes_this_frame); } }
void osd_update_audio_stream(running_machine *machine, INT16 *buffer, int samples_this_frame) { int bytes_this_frame = samples_this_frame * stream_format.nBlockAlign; DWORD play_position, write_position; HRESULT result; // if no sound, there is no buffer if (stream_buffer == NULL) return; // determine the current play position result = IDirectSoundBuffer_GetCurrentPosition(stream_buffer, &play_position, &write_position); if (result == DS_OK) { DWORD stream_in; //DWORD orig_write = write_position; // normalize the write position so it is always after the play position if (write_position < play_position) write_position += stream_buffer_size; // normalize the stream in position so it is always after the write position stream_in = stream_buffer_in; if (stream_in < write_position) stream_in += stream_buffer_size; // now we should have, in order: // <------pp---wp---si---------------> // if we're between play and write positions, then bump forward, but only in full chunks while (stream_in < write_position) { //printf("Underflow: PP=%d WP=%d(%d) SI=%d(%d) BTF=%d\n", (int)play_position, (int)write_position, (int)orig_write, (int)stream_in, (int)stream_buffer_in, (int)bytes_this_frame); buffer_underflows++; stream_in += bytes_this_frame; } // if we're going to overlap the play position, just skip this chunk if (stream_in + bytes_this_frame > play_position + stream_buffer_size) { //printf("Overflow: PP=%d WP=%d(%d) SI=%d(%d) BTF=%d\n", (int)play_position, (int)write_position, (int)orig_write, (int)stream_in, (int)stream_buffer_in, (int)bytes_this_frame); buffer_overflows++; return; } // now we know where to copy; let's do it stream_buffer_in = stream_in % stream_buffer_size; copy_sample_data(buffer, bytes_this_frame); } }
void sdl_osd_interface::update_audio_stream(const INT16 *buffer, int samples_this_frame) { // if nothing to do, don't do it if (machine().sample_rate() != 0 && stream_buffer) { int bytes_this_frame = samples_this_frame * sizeof(INT16) * 2; int play_position, write_position, stream_in; int orig_write; // used in LOG play_position = stream_playpos; write_position = stream_playpos + ((machine().sample_rate() / 50) * sizeof(INT16) * 2); orig_write = write_position; if (!stream_in_initialized) { stream_in = stream_buffer_in = (write_position + stream_buffer_size) / 2; if (LOG_SOUND) { fprintf(sound_log, "stream_in = %d\n", (int)stream_in); fprintf(sound_log, "stream_playpos = %d\n", (int)stream_playpos); fprintf(sound_log, "write_position = %d\n", (int)write_position); } // start playing SDL_PauseAudio(0); stream_in_initialized = 1; } else { // normalize the stream in position stream_in = stream_buffer_in; if (stream_in < write_position && stream_loop == 1) stream_in += stream_buffer_size; // now we should have, in order: // <------pp---wp---si---------------> // if we're between play and write positions, then bump forward, but only in full chunks while (stream_in < write_position) { if (LOG_SOUND) fprintf(sound_log, "Underflow: PP=%d WP=%d(%d) SI=%d(%d) BTF=%d\n", (int)play_position, (int)write_position, (int)orig_write, (int)stream_in, (int)stream_buffer_in, (int)bytes_this_frame); buffer_underflows++; stream_in += bytes_this_frame; } // if we're going to overlap the play position, just skip this chunk if (stream_in + bytes_this_frame > play_position + stream_buffer_size) { if (LOG_SOUND) fprintf(sound_log, "Overflow: PP=%d WP=%d(%d) SI=%d(%d) BTF=%d\n", (int)play_position, (int)write_position, (int)orig_write, (int)stream_in, (int)stream_buffer_in, (int)bytes_this_frame); buffer_overflows++; return; } } if (stream_in >= stream_buffer_size) { stream_in -= stream_buffer_size; stream_loop = 1; if (LOG_SOUND) fprintf(sound_log, "stream_loop set to 1 (stream_in looped)\n"); } // now we know where to copy; let's do it stream_buffer_in = stream_in; copy_sample_data(machine(), buffer, bytes_this_frame); } }