output/alsa: move code to PlayRaw()
This commit is contained in:
parent
d842d21be0
commit
8364029db8
@ -141,6 +141,7 @@ struct AlsaOutput {
|
|||||||
void Open(AudioFormat &audio_format);
|
void Open(AudioFormat &audio_format);
|
||||||
void Close();
|
void Close();
|
||||||
|
|
||||||
|
size_t PlayRaw(ConstBuffer<void> data);
|
||||||
size_t Play(const void *chunk, size_t size);
|
size_t Play(const void *chunk, size_t size);
|
||||||
void Drain();
|
void Drain();
|
||||||
void Cancel();
|
void Cancel();
|
||||||
@ -837,6 +838,36 @@ AlsaOutput::Close()
|
|||||||
delete[] silence;
|
delete[] silence;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline size_t
|
||||||
|
AlsaOutput::PlayRaw(ConstBuffer<void> data)
|
||||||
|
{
|
||||||
|
if (data.IsEmpty())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
assert(data.size % out_frame_size == 0);
|
||||||
|
|
||||||
|
const size_t n_frames = data.size / out_frame_size;
|
||||||
|
assert(n_frames > 0);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
const auto frames_written = snd_pcm_writei(pcm, data.data,
|
||||||
|
n_frames);
|
||||||
|
if (frames_written > 0) {
|
||||||
|
period_position = (period_position + frames_written)
|
||||||
|
% period_frames;
|
||||||
|
|
||||||
|
return frames_written * out_frame_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (frames_written < 0 && frames_written != -EAGAIN &&
|
||||||
|
frames_written != -EINTR &&
|
||||||
|
Recover(frames_written) < 0)
|
||||||
|
throw FormatRuntimeError("snd_pcm_writei() failed: %s",
|
||||||
|
snd_strerror(-frames_written));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
inline size_t
|
inline size_t
|
||||||
AlsaOutput::Play(const void *chunk, size_t size)
|
AlsaOutput::Play(const void *chunk, size_t size)
|
||||||
{
|
{
|
||||||
@ -862,29 +893,8 @@ AlsaOutput::Play(const void *chunk, size_t size)
|
|||||||
been played */
|
been played */
|
||||||
return size;
|
return size;
|
||||||
|
|
||||||
chunk = e.data;
|
const size_t bytes_written = PlayRaw(e);
|
||||||
size = e.size;
|
return pcm_export->CalcSourceSize(bytes_written);
|
||||||
|
|
||||||
assert(size % out_frame_size == 0);
|
|
||||||
|
|
||||||
size /= out_frame_size;
|
|
||||||
assert(size > 0);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
snd_pcm_sframes_t ret = snd_pcm_writei(pcm, chunk, size);
|
|
||||||
if (ret > 0) {
|
|
||||||
period_position = (period_position + ret)
|
|
||||||
% period_frames;
|
|
||||||
|
|
||||||
size_t bytes_written = ret * out_frame_size;
|
|
||||||
return pcm_export->CalcSourceSize(bytes_written);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret < 0 && ret != -EAGAIN && ret != -EINTR &&
|
|
||||||
Recover(ret) < 0)
|
|
||||||
throw FormatRuntimeError("snd_pcm_writei() failed: %s",
|
|
||||||
snd_strerror(-ret));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef AudioOutputWrapper<AlsaOutput> Wrapper;
|
typedef AudioOutputWrapper<AlsaOutput> Wrapper;
|
||||||
|
Loading…
Reference in New Issue
Block a user