/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * audiooutputenginedummy.cc * * Sat Apr 30 21:12:02 CEST 2011 * Copyright 2011 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of DrumGizmo. * * DrumGizmo is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * DrumGizmo 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with DrumGizmo; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "audioout.h" #define T(x, msg) if(x < 0) { printf("%s failed: %s\n", msg, snd_strerror(x)); fflush(stdout); } AudioOut::AudioOut(std::string device, unsigned int srate, int channels) { handle = NULL; snd_pcm_uframes_t frames = 940; int rc; rc = snd_pcm_open(&handle, device.c_str(), SND_PCM_STREAM_PLAYBACK, 0); T(rc, "snd_pcm_open"); if(!handle) { printf("No handle!\n"); // return false; } // Allocate a hardware parameters object. snd_pcm_hw_params_alloca(¶ms); // if(rc < 0) return false; // Fill it in with default values. rc = snd_pcm_hw_params_any(handle, params); T(rc, "snd_pcm_hw_params_any"); rc = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED); T(rc, "snd_pcm_hw_params_set_access"); rc = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_FLOAT); T(rc, "snd_pcm_hw_params_set_format"); rc = snd_pcm_hw_params_set_channels(handle, params, channels); T(rc, "snd_pcm_hw_params_set_channels"); rc = snd_pcm_hw_params_set_rate_near(handle, params, &srate, 0); T(rc, "snd_pcm_hw_params_set_rate_near"); rc = snd_pcm_hw_params_set_period_size_near(handle, params, &frames, 0); T(rc, "snd_pcm_hw_params_set_period_size_near"); rc = snd_pcm_hw_params(handle, params); T(rc, "snd_pcm_hw_params"); } AudioOut::~AudioOut() { if(handle) snd_pcm_close(handle); } void AudioOut::write(sample_t *samples, size_t size) { // Write the interleaved buffer to the soundcard size_t sz = 0; while(size > sz) { sz += snd_pcm_writei(handle, samples + sz, size - sz); } }