int sa_stream_drain(sa_stream_t *s) { if (s == NULL || s->output_unit == NULL) { return SA_ERROR_NO_INIT; } if (snd_pcm_state(s->output_unit) == SND_PCM_STATE_PREPARED) { size_t min_samples = 0; size_t min_bytes = 0; void *buf; if (sa_stream_get_min_write(s, &min_samples) < 0) return SA_ERROR_SYSTEM; min_bytes = snd_pcm_frames_to_bytes(s->output_unit, min_samples); buf = malloc(min_bytes); if (!buf) return SA_ERROR_SYSTEM; memset(buf, 0, min_bytes); sa_stream_write(s, buf, min_bytes); free(buf); } if (snd_pcm_state(s->output_unit) != SND_PCM_STATE_RUNNING) { return SA_ERROR_INVALID; } snd_pcm_drain(s->output_unit); return SA_SUCCESS; }
int32_t nsNativeAudioStream::GetMinWriteSize() { size_t size; int r = sa_stream_get_min_write(static_cast<sa_stream_t*>(mAudioHandle), &size); if (r == SA_ERROR_NOT_SUPPORTED) return 1; else if (r != SA_SUCCESS || size > INT32_MAX) return -1; return static_cast<int32_t>(size / mChannels / sizeof(short)); }