Browse Source

JackAlsaIOAdapter almost working

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2616 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
sletz 17 years ago
parent
commit
04cadba351
2 changed files with 56 additions and 1 deletions
  1. +54
    -0
      linux/alsa/JackAlsaIOAdapter.cpp
  2. +2
    -1
      linux/alsa/JackAlsaIOAdapter.h

+ 54
- 0
linux/alsa/JackAlsaIOAdapter.cpp View File

@@ -42,11 +42,65 @@ int JackAlsaIOAdapter::Close()
fThread.Stop();
return fAudioInterface.close();
}

bool JackAlsaIOAdapter::Init()
{
fAudioInterface.write();
fAudioInterface.write();
return true;
}
bool JackAlsaIOAdapter::Execute()
{
if (fAudioInterface.read() < 0)
return false;

if (!fRunning) {
fRunning = true;
jack_time_t time = jack_get_time();
fProducerDLL.Init(time);
fConsumerDLL.Init(time);
}

// DLL
jack_time_t time = jack_get_time();
fProducerDLL.IncFrame(time);
jack_nframes_t time1 = fConsumerDLL.Time2Frames(time);
jack_nframes_t time2 = fProducerDLL.Time2Frames(time);
double src_ratio_output = double(time2) / double(time1);
double src_ratio_input = double(time1) / double(time2);
if (src_ratio_input < 0.7f || src_ratio_input > 1.3f) {
jack_error("src_ratio_input = %f", src_ratio_input);
src_ratio_input = 1;
time1 = 1;
time2 = 1;
}
if (src_ratio_output < 0.7f || src_ratio_output > 1.3f) {
jack_error("src_ratio_output = %f", src_ratio_output);
src_ratio_output = 1;
time1 = 1;
time2 = 1;
}
src_ratio_input = Range(0.7f, 1.3f, src_ratio_input);
src_ratio_output = Range(0.7f, 1.3f, src_ratio_output);
jack_log("Callback resampler src_ratio_input = %f src_ratio_output = %f", src_ratio_input, src_ratio_output);
for (int i = 0; i < fCaptureChannels; i++) {
float* buffer = (float*)fAudioInterface.fInputSoftChannels[i];
fCaptureRingBuffer[i]->SetRatio(time1, time2);
fCaptureRingBuffer[i]->WriteResample(buffer, fBufferSize);
}
for (int i = 0; i < fPlaybackChannels; i++) {
float* buffer = (float*)fAudioInterface.fOutputSoftChannels[i];
fPlaybackRingBuffer[i]->SetRatio(time2, time1);
fPlaybackRingBuffer[i]->ReadResample(buffer, fBufferSize);
}
if (fAudioInterface.write() < 0)
return false;
jack_log("execute");


+ 2
- 1
linux/alsa/JackAlsaIOAdapter.h View File

@@ -300,7 +300,7 @@ jack_log("opren ok");
} else if (fSampleAccess == SND_PCM_ACCESS_RW_NONINTERLEAVED) {
int count = snd_pcm_readn(fInputDevice, fInputCardChannels, fBuffering);
if (count<0) {
if (count < 0) {
display_error_msg(count, "reading samples");
int err = snd_pcm_prepare(fInputDevice);
check_error_msg(err, "preparing input stream");
@@ -510,6 +510,7 @@ jack_log("opren ok");
virtual int SetBufferSize(jack_nframes_t buffer_size);
virtual bool Init();
virtual bool Execute();
};


Loading…
Cancel
Save