summaryrefslogtreecommitdiff
path: root/src/sink.cc
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2014-09-25 17:08:44 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2014-09-25 17:08:44 +0200
commit4f6b15ea26b5fa09f300f67e4ce1057c2b39a3aa (patch)
tree45d7bb4a9a90ef603b5a7a65a4d4d4309a7a1538 /src/sink.cc
parent0602763044f0f0f9163f2a888627213347d3dbb7 (diff)
New API, new name, new version.
Diffstat (limited to 'src/sink.cc')
-rw-r--r--src/sink.cc79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/sink.cc b/src/sink.cc
new file mode 100644
index 0000000..4f7cd0f
--- /dev/null
+++ b/src/sink.cc
@@ -0,0 +1,79 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * sink.cc
+ *
+ * Thu Sep 25 10:35:42 CEST 2014
+ * Copyright 2014 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of LibAudioIO.
+ *
+ * LibAudioIO is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * LibAudioIO is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with LibAudioIO; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "sink.h"
+Sink::Sink(snd_pcm_t *handle, unsigned int _samplerate,
+ unsigned int _channels, snd_pcm_uframes_t _frames)
+{
+ this->handle = handle;
+ this->_samplerate = _samplerate;
+ this->_channels = _channels;
+ this->_frames = _frames;
+}
+
+Sink::~Sink()
+{
+ snd_pcm_drain(handle);
+ snd_pcm_close(handle);
+}
+
+int Sink::writeSamples(const char *pcm, size_t size)
+{
+ int rc;
+
+ /*
+ if(size < frames * sizeof(short) * channels) {
+ throw PcmBufferTooSmall();
+ }
+ */
+
+ rc = snd_pcm_writei(handle, pcm, size / sizeof(short));
+ if(rc == -EPIPE) {
+ // EPIPE means overrun
+ //snd_pcm_prepare(handle);
+ return -2;
+ } else if (rc < 0) {
+ return -1; // Read Error
+ }
+
+ return rc * sizeof(short) /* * channels */ ;
+}
+
+unsigned int Sink::samplerate()
+{
+ return this->_samplerate;
+}
+
+unsigned int Sink::channels()
+{
+ return this->_channels;
+}
+
+snd_pcm_uframes_t Sink::frames()
+{
+ return this->_frames;
+}