/* Copyright (C) 2008 Grame This program 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. This program 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 this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "JackAlsaIOAdapter.h" namespace Jack { int JackAlsaIOAdapter::Open() { if (fAudioInterface.open() == 0) { fAudioInterface.longinfo(); fThread.AcquireRealTime(85); fThread.StartSync(); return 0; } else { return -1; } } int JackAlsaIOAdapter::Close() { #ifdef DEBUG fTable.Save(); #endif fThread.Stop(); return fAudioInterface.close(); } bool JackAlsaIOAdapter::Init() { fAudioInterface.write(); fAudioInterface.write(); return true; } bool JackAlsaIOAdapter::Execute() { if (fAudioInterface.read() < 0) return false; bool failure = false; jack_nframes_t time1, time2; ResampleFactor(time1, time2); for (int i = 0; i < fCaptureChannels; i++) { fCaptureRingBuffer[i]->SetRatio(time1, time2); if (fCaptureRingBuffer[i]->WriteResample(fAudioInterface.fInputSoftChannels[i], fBufferSize) < fBufferSize) failure = true; } for (int i = 0; i < fPlaybackChannels; i++) { fPlaybackRingBuffer[i]->SetRatio(time2, time1); if (fPlaybackRingBuffer[i]->ReadResample(fAudioInterface.fOutputSoftChannels[i], fBufferSize) < fBufferSize) failure = true; } #ifdef DEBUG fTable.Write(time1, time2, double(time1) / double(time2), double(time2) / double(time1), fCaptureRingBuffer[0]->ReadSpace(), fPlaybackRingBuffer[0]->WriteSpace()); #endif if (fAudioInterface.write() < 0) return false; // Reset all ringbuffers in case of failure if (failure) { jack_error("JackAlsaIOAdapter::Execute ringbuffer failure... reset"); adapter->ResetRingBuffers(); } return true; } int JackAlsaIOAdapter::SetBufferSize(jack_nframes_t buffer_size) { JackIOAdapterInterface::SetBufferSize(buffer_size); Close(); return Open(); } }