mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-21 15:56:58 +02:00
ALSA: Address an issue where it was possible for some samples to get dropped when a capture device is closed.
This commit is contained in:
@@ -1615,9 +1615,12 @@ static mal_result mal_device__main_loop__dsound(mal_device* pDevice)
|
|||||||
// Waits for a number of frames to become available for either capture or playback. The return
|
// Waits for a number of frames to become available for either capture or playback. The return
|
||||||
// value is the number of frames available. If this is less than the fragment size it means the
|
// value is the number of frames available. If this is less than the fragment size it means the
|
||||||
// main loop has been terminated from another thread. The return value will be clamped to the
|
// main loop has been terminated from another thread. The return value will be clamped to the
|
||||||
// fragment size.
|
// fragment size if the main loop is still running, but could be larger if it returns due to the
|
||||||
|
// main loop being terminated.
|
||||||
//
|
//
|
||||||
// This will return early if the main loop is broken with mal_device__break_main_loop().
|
// This will return early if the main loop is broken with mal_device__break_main_loop(), in
|
||||||
|
// which case it is possible for the returned number of frames will be greater than the size of
|
||||||
|
// a fragment (but smaller than the total buffer size).
|
||||||
mal_uint32 mal_device__wait_for_frames__alsa(mal_device* pDevice)
|
mal_uint32 mal_device__wait_for_frames__alsa(mal_device* pDevice)
|
||||||
{
|
{
|
||||||
mal_assert(pDevice != NULL);
|
mal_assert(pDevice != NULL);
|
||||||
@@ -1655,9 +1658,8 @@ mal_uint32 mal_device__wait_for_frames__alsa(mal_device* pDevice)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// There's a small chance we'll have more frames available than the size of a fragment. These frames
|
// There's a small chance we'll have more frames available than the size of a fragment.
|
||||||
// will be lost to cyberspace :(
|
return framesAvailable;
|
||||||
return (framesAvailable < pDevice->fragmentSizeInFrames) ? framesAvailable : pDevice->fragmentSizeInFrames;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mal_bool32 mal_device_write__alsa(mal_device* pDevice)
|
mal_bool32 mal_device_write__alsa(mal_device* pDevice)
|
||||||
@@ -2027,7 +2029,7 @@ mal_result mal_device_init__alsa(mal_device* pDevice, mal_device_type type, mal_
|
|||||||
|
|
||||||
// If we're _not_ using mmap we need to use an intermediary buffer.
|
// If we're _not_ using mmap we need to use an intermediary buffer.
|
||||||
if (!pDevice->alsa.isUsingMMap) {
|
if (!pDevice->alsa.isUsingMMap) {
|
||||||
pDevice->alsa.pIntermediaryBuffer = mal_malloc(pDevice->fragmentSizeInFrames * pDevice->channels * mal_get_sample_size_in_bytes(pDevice->format));
|
pDevice->alsa.pIntermediaryBuffer = mal_malloc(pDevice->fragmentSizeInFrames*pDevice->fragmentCount * pDevice->channels * mal_get_sample_size_in_bytes(pDevice->format));
|
||||||
if (pDevice->alsa.pIntermediaryBuffer == NULL) {
|
if (pDevice->alsa.pIntermediaryBuffer == NULL) {
|
||||||
mal_device_uninit__alsa(pDevice);
|
mal_device_uninit__alsa(pDevice);
|
||||||
return mal_post_error(pDevice, "[ALSA] Failed to set software parameters. snd_pcm_sw_params() failed.", MAL_OUT_OF_MEMORY);
|
return mal_post_error(pDevice, "[ALSA] Failed to set software parameters. snd_pcm_sw_params() failed.", MAL_OUT_OF_MEMORY);
|
||||||
@@ -2511,10 +2513,10 @@ mal_uint32 mal_get_sample_size_in_bytes(mal_format format)
|
|||||||
// ====
|
// ====
|
||||||
// - Support rewinding. This will enable applications to employ better anti-latency.
|
// - Support rewinding. This will enable applications to employ better anti-latency.
|
||||||
// - Implement the null device.
|
// - Implement the null device.
|
||||||
// - Pass the log callback to mal_device_init().
|
|
||||||
// - Consider having some core formats which are guaranteed to work. Perhaps u8, s16 and
|
// - Consider having some core formats which are guaranteed to work. Perhaps u8, s16 and
|
||||||
// f32 to cover the 8-, 16 and 32-bit ranges.
|
// f32 to cover the 8-, 16 and 32-bit ranges.
|
||||||
// - The rationale for this is to make it easier for
|
// - The rationale for this is to make it easier for applications to get audio working
|
||||||
|
// without any fuss.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// ALSA
|
// ALSA
|
||||||
|
|||||||
Reference in New Issue
Block a user