Work on sound driver levels.

This commit is contained in:
BearOso 2023-07-03 15:35:11 -05:00
parent 62c4686fc6
commit e9b4f6d7fe
6 changed files with 60 additions and 6 deletions

View File

@ -91,6 +91,29 @@ class Resampler
r_right[0] = r_right[1] = r_right[2] = r_right[3] = 0;
}
inline void dump(unsigned int num_samples)
{
if (space_filled() >= num_samples)
start = (start + num_samples) % buffer_size;
}
inline void add_silence(unsigned int num_samples)
{
if (space_empty() <= num_samples)
{
int new_end = (end + num_samples) % buffer_size;
if (new_end < end)
{
memset(buffer + end, 0, 2 * (buffer_size - end));
memset(buffer, 0, 2 * (num_samples - (buffer_size - end)));
}
memset(buffer + end, 0, 2 * num_samples);
end = new_end;
}
}
inline bool pull(int16_t *dst, int num_samples)
{
if (space_filled() < num_samples)

View File

@ -10,11 +10,13 @@
bool S9xCubebSoundDriver::write_samples(int16_t *data, int samples)
{
bool retval = true;
if (samples > buffer.space_empty())
auto empty = buffer.space_empty();
if (samples > empty)
{
retval = false;
samples = buffer.space_empty();
buffer.dump(buffer.buffer_size / 2 - empty);
}
buffer.push(data, samples);
return retval;
@ -83,6 +85,7 @@ long S9xCubebSoundDriver::data_callback(cubeb_stream *stream, void const *input_
auto zeroed_samples = nframes * 2 - avail;
memset(output_buffer, 0, zeroed_samples);
buffer.read((int16_t *)output_buffer + zeroed_samples, nframes * 2 - zeroed_samples);
buffer.add_silence(buffer.buffer_size / 2);
}
else
{

View File

@ -111,10 +111,10 @@ bool S9xPulseSoundDriver::open_device(int playback_rate, int buffer_size_ms)
ss.rate = playback_rate;
pa_buffer_attr buffer_attr;
buffer_attr.tlength = pa_usec_to_bytes(buffer_size_ms * 1000, &ss);
buffer_attr.tlength = 2 * pa_usec_to_bytes(buffer_size_ms * 1000, &ss);
buffer_attr.maxlength = buffer_attr.tlength * 2;
buffer_attr.minreq = pa_usec_to_bytes(3000, &ss);
buffer_attr.prebuf = -1;
buffer_attr.prebuf = buffer_attr.tlength / 2;
printf("PulseAudio sound driver initializing...\n");
@ -189,8 +189,23 @@ bool S9xPulseSoundDriver::write_samples(int16_t *data, int samples)
size_t bytes = pa_stream_writable_size(stream);
unlock();
if (samples * 2 > bytes)
if (draining)
{
if (bytes > buffer_size / 2)
{
return false;
}
else
{
draining = false;
}
}
if (samples * 2 > bytes)
{
draining = true;
return false;
}
if (samples * 2 < bytes)
bytes = samples * 2;

View File

@ -32,6 +32,7 @@ class S9xPulseSoundDriver : public S9xSoundDriver
void wait();
int buffer_size;
bool draining = false;
};
#endif /* __S9X_SOUND_DRIVER_PULSE_HPP */

View File

@ -10,10 +10,11 @@
bool S9xSDLSoundDriver::write_samples(int16_t *data, int samples)
{
bool retval = true;
if (samples > buffer.space_empty())
auto empty = buffer.space_empty();
if (samples > empty)
{
retval = false;
samples = buffer.space_empty();
buffer.dump(buffer.buffer_size / 2 - empty);
}
buffer.push(data, samples);
@ -24,6 +25,11 @@ void S9xSDLSoundDriver::mix(unsigned char *output, int bytes)
{
if (buffer.avail() >= bytes >> 1)
buffer.read((int16_t *)output, bytes >> 1);
else
{
buffer.read((int16_t *)output, buffer.avail());
buffer.add_silence(buffer.buffer_size / 2);
}
}
S9xSDLSoundDriver::S9xSDLSoundDriver()

View File

@ -84,8 +84,14 @@ static void trackBufferLevel(int percent, QWidget *parent)
ticks = 0;
}
dialog->setFocusPolicy(Qt::FocusPolicy::NoFocus);
if (!dialog->isVisible())
{
dialog->setDisabled(true);
dialog->show();
dialog->setModal(false);
}
}
#endif