summaryrefslogtreecommitdiffstats
path: root/flow/audioiosndio.cc
diff options
context:
space:
mode:
authorMichele Calgaro <[email protected]>2020-12-06 19:28:06 +0900
committerMichele Calgaro <[email protected]>2020-12-06 19:28:06 +0900
commit00d4f92b717fbcbed6f9eee361975d6ee5380d59 (patch)
tree043b5970d66e539e1fbf6dde03440d6569e34c4e /flow/audioiosndio.cc
parent2f53bfe61c8ee78ff36ac6c66ae714b01e407b33 (diff)
downloadarts-00d4f92b717fbcbed6f9eee361975d6ee5380d59.tar.gz
arts-00d4f92b717fbcbed6f9eee361975d6ee5380d59.zip
Renaming of files in preparation for code style tools.
Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'flow/audioiosndio.cc')
-rw-r--r--flow/audioiosndio.cc310
1 files changed, 0 insertions, 310 deletions
diff --git a/flow/audioiosndio.cc b/flow/audioiosndio.cc
deleted file mode 100644
index 03efd1b..0000000
--- a/flow/audioiosndio.cc
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Copyright (c) 2008 Jacob Meuser <[email protected]>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_CONFIG_H
- #include <config.h>
-#endif
-
-#ifdef HAVE_LIBSNDIO
-
-#include <sys/types.h>
-#include <errno.h>
-#include <math.h>
-
-#include <sndio.h>
-#include <poll.h>
-
-#include "debug.h"
-#include "audioio.h"
-#include "audiosubsys.h"
-#include "iomanager.h"
-#include "dispatcher.h"
-
-#include <cstdlib>
-#include <cstring>
-
-int bps, chans;
-long long realpos, playpos, recpos;
-
-void movecb(void *addr, int delta)
-{
- realpos += delta * (int)(bps * chans);
-}
-
-namespace Arts {
-
-class AudioIOSNDIO : public AudioIO, public TimeNotify {
-
-protected:
- struct sio_hdl *hdl;
- struct sio_par par;
- int bufsz;
- int bufused;
- int duplex;
-
-public:
- AudioIOSNDIO();
-
- void notifyTime();
-
- void setParam(AudioParam param, int& value);
- int getParam(AudioParam param);
-
- bool open();
- void close();
- int read(void *buffer, int size);
- int write(void *buffer, int size);
-};
-
-REGISTER_AUDIO_IO(AudioIOSNDIO,"sndio","libsndio");
-}
-
-using namespace std;
-using namespace Arts;
-
-AudioIOSNDIO::AudioIOSNDIO()
-{
- /* default parameters */
- param(samplingRate) = 48000;
- paramStr(deviceName) = "";
- param(fragmentSize) = 4096;
- param(fragmentCount) = 4;
- param(format) = 16;
- param(channels) = 2;
- param(direction) = directionWrite;
-}
-
-bool AudioIOSNDIO::open()
-{
- string& _error = paramStr(lastError);
- string& _deviceName = paramStr(deviceName);
- int& _channels = param(channels);
- int& _fragmentSize = param(fragmentSize);
- int& _fragmentCount = param(fragmentCount);
- int& _samplingRate = param(samplingRate);
- int& _format = param(format);
-
- struct sio_par testpar;
- char dev[PATH_MAX];
- int mode, bpf;
-
- duplex = 0;
- if (param(direction) == (directionRead | directionWrite)) {
- mode = SIO_PLAY | SIO_REC;
- duplex = 1;
- } else if (param(direction) == directionWrite) {
- mode = SIO_PLAY;
- } else {
- _error = "invalid direction";
- return false;
- }
-
- strlcpy(dev, _deviceName.c_str(), PATH_MAX);
-
- if (strcmp(dev, "") == 0)
- hdl = sio_open(NULL, mode, 0);
- else
- hdl = sio_open(dev, mode, 0);
-
- if (hdl == NULL) {
- _error = "device ";
- if (strcmp(_deviceName.c_str(), "") == 0)
- _error += "(default sndio device)";
- else
- _error += _deviceName.c_str();
- _error += " can't be opened";
- return false;
- }
-
- sio_initpar(&par);
-
- if (_format == 8) {
- par.bits = 8;
- par.sig = 0;
- } else {
- par.bits = 16;
- par.sig = 1;
- par.le = 1;
- }
-
- if (duplex)
- par.pchan = par.rchan = _channels;
- else
- par.pchan = _channels;
-
- par.rate = _samplingRate;
-
- /* limit the buffer size for hardware constraints */
-
- if (_fragmentSize > 1024*16)
- _fragmentSize = 1024*16;
-
- while (_fragmentSize * _fragmentCount > 1024*32)
- _fragmentCount--;
-
- bpf = ((par.bits / NBBY) * par.pchan);
- par.round = _fragmentSize / bpf;
- par.appbufsz = _fragmentSize * _fragmentCount / bpf;
-
- testpar = par;
-
- char details[128];
-
- snprintf(details, 128, " rate=%d pchan=%d bits=%d le=%d sig=%d sz=%d",
- par.rate, par.pchan, par.bits, par.le, par.sig, par.appbufsz);
-
- if (!sio_setpar(hdl, &par)) {
- _error = "sio_setpar failed:";
- _error += details;
-
- close();
- return false;
- }
-
- if (!sio_getpar(hdl, &par)) {
- _error = "sio_getpar failed";
-
- close();
- return false;
- }
-
- if (testpar.bits != par.bits ||
- testpar.sig != par.sig ||
- testpar.le != par.le ||
- testpar.pchan != par.pchan ||
- fabs((testpar.rate - par.rate)/testpar.rate) > 0.05) {
- _error = "returned params do not match requested params";
-
- close();
- return false;
- }
-
- bpf = par.pchan * par.bps;
- bufsz = par.bufsz * bpf;
-
- ::bps = par.bps;
- ::chans = par.pchan;
- ::realpos = ::playpos = ::recpos = 0;
-
- sio_onmove(hdl, ::movecb, NULL);
-
- if (!sio_start(hdl)) {
- _error = "sio_start failed";
-
- close();
- return false;
- }
-
- /* use a timer instead of select() */
- Dispatcher::the()->ioManager()->addTimer(10, this);
-
- return true;
-}
-
-void AudioIOSNDIO::close()
-{
- if (hdl != NULL) {
- sio_close(hdl);
- hdl = NULL;
- }
-}
-
-void AudioIOSNDIO::setParam(AudioParam p, int& value)
-{
- param(p) = value;
-}
-
-int AudioIOSNDIO::getParam(AudioParam p)
-{
- struct pollfd gpfd;
- int n, events;
-
- /* update ::realpos */
- if ((p == canRead || p == canWrite) && hdl != NULL) {
- events = POLLOUT;
- if (duplex)
- events |= POLLIN;
- n = sio_pollfd(hdl, &gpfd, events);
- while (poll(&gpfd, n, 0) < 0 && errno == EINTR)
- ;
- sio_revents(hdl, &gpfd);
- }
-
- switch(p) {
- case canRead:
- bufused = (::realpos - ::recpos < 0) ? 0 : ::realpos - ::recpos;
- return bufused;
- break;
- case canWrite:
- bufused = (::realpos < 0) ? ::playpos : ::playpos - ::realpos;
- return bufsz - bufused;
- break;
- case autoDetect:
- return 15;
- break;
- default:
- return param(p);
- break;
- }
-}
-
-int AudioIOSNDIO::read(void *buffer, int size)
-{
- arts_assert(hdl != NULL);
-
- size_t result;
-
- result = sio_read(hdl, buffer, size);
-
- ::recpos += result;
-
- return (int)result;
-}
-
-int AudioIOSNDIO::write(void *buffer, int size)
-{
- arts_assert(hdl != NULL);
-
- size_t result;
-
- result = sio_write(hdl, buffer, size);
-
- ::playpos += result;
-
- return (int)result;
-}
-
-void AudioIOSNDIO::notifyTime()
-{
- int& _direction = param(direction);
-
- for (;;) {
- int todo = 0;
-
- if ((_direction & directionRead) && (getParam(canRead) > 0))
- todo |= AudioSubSystem::ioRead;
-
- if ((_direction & directionWrite) && (getParam(canWrite) > 0))
- todo |= AudioSubSystem::ioWrite;
-
- if (todo == 0)
- return;
-
- AudioSubSystem::the()->handleIO(todo);
- }
-}
-
-#endif