mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-23 08:44:04 +02:00
Fix C++ build for GCC/ALSA.
This commit is contained in:
@@ -1630,18 +1630,18 @@ mal_uint32 mal_device__wait_for_frames__alsa(mal_device* pDevice)
|
|||||||
mal_assert(pDevice != NULL);
|
mal_assert(pDevice != NULL);
|
||||||
|
|
||||||
while (!pDevice->alsa.breakFromMainLoop) {
|
while (!pDevice->alsa.breakFromMainLoop) {
|
||||||
snd_pcm_sframes_t framesAvailable = snd_pcm_avail(pDevice->alsa.pPCM);
|
snd_pcm_sframes_t framesAvailable = snd_pcm_avail((snd_pcm_t*)pDevice->alsa.pPCM);
|
||||||
if (framesAvailable >= pDevice->fragmentSizeInFrames) {
|
if (framesAvailable >= pDevice->fragmentSizeInFrames) {
|
||||||
return pDevice->fragmentSizeInFrames;
|
return pDevice->fragmentSizeInFrames;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (framesAvailable < 0) {
|
if (framesAvailable < 0) {
|
||||||
if (framesAvailable == -EPIPE) {
|
if (framesAvailable == -EPIPE) {
|
||||||
if (snd_pcm_recover(pDevice->alsa.pPCM, framesAvailable, MAL_TRUE) < 0) {
|
if (snd_pcm_recover((snd_pcm_t*)pDevice->alsa.pPCM, framesAvailable, MAL_TRUE) < 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
framesAvailable = snd_pcm_avail(pDevice->alsa.pPCM);
|
framesAvailable = snd_pcm_avail((snd_pcm_t*)pDevice->alsa.pPCM);
|
||||||
if (framesAvailable < 0) {
|
if (framesAvailable < 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1649,15 +1649,15 @@ mal_uint32 mal_device__wait_for_frames__alsa(mal_device* pDevice)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const int timeoutInMilliseconds = 20; // <-- The larger this value, the longer it'll take to stop the device!
|
const int timeoutInMilliseconds = 20; // <-- The larger this value, the longer it'll take to stop the device!
|
||||||
int waitResult = snd_pcm_wait(pDevice->alsa.pPCM, timeoutInMilliseconds);
|
int waitResult = snd_pcm_wait((snd_pcm_t*)pDevice->alsa.pPCM, timeoutInMilliseconds);
|
||||||
if (waitResult < 0) {
|
if (waitResult < 0) {
|
||||||
snd_pcm_recover(pDevice->alsa.pPCM, waitResult, MAL_TRUE);
|
snd_pcm_recover((snd_pcm_t*)pDevice->alsa.pPCM, waitResult, MAL_TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We'll get here if the loop was terminated. Just return whatever's available, making sure it's never
|
// We'll get here if the loop was terminated. Just return whatever's available, making sure it's never
|
||||||
// more than the size of a fragment.
|
// more than the size of a fragment.
|
||||||
snd_pcm_sframes_t framesAvailable = snd_pcm_avail(pDevice->alsa.pPCM);
|
snd_pcm_sframes_t framesAvailable = snd_pcm_avail((snd_pcm_t*)pDevice->alsa.pPCM);
|
||||||
if (framesAvailable < 0) {
|
if (framesAvailable < 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1693,7 +1693,7 @@ mal_bool32 mal_device_write__alsa(mal_device* pDevice)
|
|||||||
snd_pcm_uframes_t mappedOffset;
|
snd_pcm_uframes_t mappedOffset;
|
||||||
snd_pcm_uframes_t mappedFrames = framesAvailable;
|
snd_pcm_uframes_t mappedFrames = framesAvailable;
|
||||||
while (framesAvailable > 0) {
|
while (framesAvailable > 0) {
|
||||||
int result = snd_pcm_mmap_begin(pDevice->alsa.pPCM, &pAreas, &mappedOffset, &mappedFrames);
|
int result = snd_pcm_mmap_begin((snd_pcm_t*)pDevice->alsa.pPCM, &pAreas, &mappedOffset, &mappedFrames);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
return MAL_FALSE;
|
return MAL_FALSE;
|
||||||
}
|
}
|
||||||
@@ -1701,9 +1701,9 @@ mal_bool32 mal_device_write__alsa(mal_device* pDevice)
|
|||||||
void* pBuffer = (mal_uint8*)pAreas[0].addr + ((pAreas[0].first + (mappedOffset * pAreas[0].step)) / 8);
|
void* pBuffer = (mal_uint8*)pAreas[0].addr + ((pAreas[0].first + (mappedOffset * pAreas[0].step)) / 8);
|
||||||
mal_device__read_samples_from_client(pDevice, mappedFrames * pDevice->channels, pBuffer);
|
mal_device__read_samples_from_client(pDevice, mappedFrames * pDevice->channels, pBuffer);
|
||||||
|
|
||||||
result = snd_pcm_mmap_commit(pDevice->alsa.pPCM, mappedOffset, mappedFrames);
|
result = snd_pcm_mmap_commit((snd_pcm_t*)pDevice->alsa.pPCM, mappedOffset, mappedFrames);
|
||||||
if (result < 0 || result != mappedFrames) {
|
if (result < 0 || (snd_pcm_uframes_t)result != mappedFrames) {
|
||||||
snd_pcm_recover(pDevice->alsa.pPCM, result, MAL_TRUE);
|
snd_pcm_recover((snd_pcm_t*)pDevice->alsa.pPCM, result, MAL_TRUE);
|
||||||
return MAL_FALSE;
|
return MAL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1724,17 +1724,17 @@ mal_bool32 mal_device_write__alsa(mal_device* pDevice)
|
|||||||
|
|
||||||
mal_device__read_samples_from_client(pDevice, framesAvailable * pDevice->channels, pDevice->alsa.pIntermediaryBuffer);
|
mal_device__read_samples_from_client(pDevice, framesAvailable * pDevice->channels, pDevice->alsa.pIntermediaryBuffer);
|
||||||
|
|
||||||
snd_pcm_sframes_t framesWritten = snd_pcm_writei(pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, framesAvailable);
|
snd_pcm_sframes_t framesWritten = snd_pcm_writei((snd_pcm_t*)pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, framesAvailable);
|
||||||
if (framesWritten < 0) {
|
if (framesWritten < 0) {
|
||||||
if (framesWritten == -EAGAIN) {
|
if (framesWritten == -EAGAIN) {
|
||||||
continue; // Just keep trying...
|
continue; // Just keep trying...
|
||||||
} else if (framesWritten == -EPIPE) {
|
} else if (framesWritten == -EPIPE) {
|
||||||
// Underrun. Just recover and try writing again.
|
// Underrun. Just recover and try writing again.
|
||||||
if (snd_pcm_recover(pDevice->alsa.pPCM, framesWritten, MAL_TRUE) < 0) {
|
if (snd_pcm_recover((snd_pcm_t*)pDevice->alsa.pPCM, framesWritten, MAL_TRUE) < 0) {
|
||||||
return MAL_FALSE;
|
return MAL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
framesWritten = snd_pcm_writei(pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, framesAvailable);
|
framesWritten = snd_pcm_writei((snd_pcm_t*)pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, framesAvailable);
|
||||||
if (framesWritten < 0) {
|
if (framesWritten < 0) {
|
||||||
return MAL_FALSE;
|
return MAL_FALSE;
|
||||||
}
|
}
|
||||||
@@ -1775,7 +1775,7 @@ mal_bool32 mal_device_read__alsa(mal_device* pDevice)
|
|||||||
snd_pcm_uframes_t mappedOffset;
|
snd_pcm_uframes_t mappedOffset;
|
||||||
snd_pcm_uframes_t mappedFrames = framesAvailable;
|
snd_pcm_uframes_t mappedFrames = framesAvailable;
|
||||||
while (framesAvailable > 0) {
|
while (framesAvailable > 0) {
|
||||||
int result = snd_pcm_mmap_begin(pDevice->alsa.pPCM, &pAreas, &mappedOffset, &mappedFrames);
|
int result = snd_pcm_mmap_begin((snd_pcm_t*)pDevice->alsa.pPCM, &pAreas, &mappedOffset, &mappedFrames);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
return MAL_FALSE;
|
return MAL_FALSE;
|
||||||
}
|
}
|
||||||
@@ -1783,9 +1783,9 @@ mal_bool32 mal_device_read__alsa(mal_device* pDevice)
|
|||||||
void* pBuffer = (mal_uint8*)pAreas[0].addr + ((pAreas[0].first + (mappedOffset * pAreas[0].step)) / 8);
|
void* pBuffer = (mal_uint8*)pAreas[0].addr + ((pAreas[0].first + (mappedOffset * pAreas[0].step)) / 8);
|
||||||
mal_device__send_samples_to_client(pDevice, mappedFrames * pDevice->channels, pBuffer);
|
mal_device__send_samples_to_client(pDevice, mappedFrames * pDevice->channels, pBuffer);
|
||||||
|
|
||||||
result = snd_pcm_mmap_commit(pDevice->alsa.pPCM, mappedOffset, mappedFrames);
|
result = snd_pcm_mmap_commit((snd_pcm_t*)pDevice->alsa.pPCM, mappedOffset, mappedFrames);
|
||||||
if (result < 0 || result != mappedFrames) {
|
if (result < 0 || (snd_pcm_uframes_t)result != mappedFrames) {
|
||||||
snd_pcm_recover(pDevice->alsa.pPCM, result, MAL_TRUE);
|
snd_pcm_recover((snd_pcm_t*)pDevice->alsa.pPCM, result, MAL_TRUE);
|
||||||
return MAL_FALSE;
|
return MAL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1800,17 +1800,17 @@ mal_bool32 mal_device_read__alsa(mal_device* pDevice)
|
|||||||
return MAL_FALSE;
|
return MAL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
framesRead = snd_pcm_readi(pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, framesAvailable);
|
framesRead = snd_pcm_readi((snd_pcm_t*)pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, framesAvailable);
|
||||||
if (framesRead < 0) {
|
if (framesRead < 0) {
|
||||||
if (framesRead == -EAGAIN) {
|
if (framesRead == -EAGAIN) {
|
||||||
continue; // Just keep trying...
|
continue; // Just keep trying...
|
||||||
} else if (framesRead == -EPIPE) {
|
} else if (framesRead == -EPIPE) {
|
||||||
// Overrun. Just recover and try reading again.
|
// Overrun. Just recover and try reading again.
|
||||||
if (snd_pcm_recover(pDevice->alsa.pPCM, framesRead, MAL_TRUE) < 0) {
|
if (snd_pcm_recover((snd_pcm_t*)pDevice->alsa.pPCM, framesRead, MAL_TRUE) < 0) {
|
||||||
return MAL_FALSE;
|
return MAL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
framesRead = snd_pcm_readi(pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, pDevice->fragmentSizeInFrames);
|
framesRead = snd_pcm_readi((snd_pcm_t*)pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, pDevice->fragmentSizeInFrames);
|
||||||
if (framesRead < 0) {
|
if (framesRead < 0) {
|
||||||
return MAL_FALSE;
|
return MAL_FALSE;
|
||||||
}
|
}
|
||||||
@@ -1893,7 +1893,7 @@ void mal_device_uninit__alsa(mal_device* pDevice)
|
|||||||
{
|
{
|
||||||
mal_assert(pDevice != NULL);
|
mal_assert(pDevice != NULL);
|
||||||
|
|
||||||
if (pDevice->alsa.pPCM) {
|
if ((snd_pcm_t*)pDevice->alsa.pPCM) {
|
||||||
snd_pcm_close((snd_pcm_t*)pDevice->alsa.pPCM);
|
snd_pcm_close((snd_pcm_t*)pDevice->alsa.pPCM);
|
||||||
|
|
||||||
if (pDevice->alsa.pIntermediaryBuffer != NULL) {
|
if (pDevice->alsa.pIntermediaryBuffer != NULL) {
|
||||||
@@ -2051,14 +2051,14 @@ static mal_result mal_device__start_backend__alsa(mal_device* pDevice)
|
|||||||
mal_assert(pDevice != NULL);
|
mal_assert(pDevice != NULL);
|
||||||
|
|
||||||
// Prepare the device first...
|
// Prepare the device first...
|
||||||
snd_pcm_prepare(pDevice->alsa.pPCM);
|
snd_pcm_prepare((snd_pcm_t*)pDevice->alsa.pPCM);
|
||||||
|
|
||||||
// ... and then grab an initial fragment from the client. After this is done, the device should
|
// ... and then grab an initial fragment from the client. After this is done, the device should
|
||||||
// automatically start playing, since that's how we configured the software parameters.
|
// automatically start playing, since that's how we configured the software parameters.
|
||||||
if (pDevice->type == mal_device_type_playback) {
|
if (pDevice->type == mal_device_type_playback) {
|
||||||
mal_device_write__alsa(pDevice);
|
mal_device_write__alsa(pDevice);
|
||||||
} else {
|
} else {
|
||||||
snd_pcm_start(pDevice->alsa.pPCM);
|
snd_pcm_start((snd_pcm_t*)pDevice->alsa.pPCM);
|
||||||
}
|
}
|
||||||
|
|
||||||
return MAL_SUCCESS;
|
return MAL_SUCCESS;
|
||||||
@@ -2068,7 +2068,7 @@ static mal_result mal_device__stop_backend__alsa(mal_device* pDevice)
|
|||||||
{
|
{
|
||||||
mal_assert(pDevice != NULL);
|
mal_assert(pDevice != NULL);
|
||||||
|
|
||||||
snd_pcm_drop(pDevice->alsa.pPCM);
|
snd_pcm_drop((snd_pcm_t*)pDevice->alsa.pPCM);
|
||||||
return MAL_SUCCESS;
|
return MAL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user