c++ Jackaudio无法获得立体声

标签 c++ c audio

我正在 Windows 8.1 上使用 C++ 尝试 JackAudio,它工作正常。

我正在使用可以在 git 上找到的简单客户端代码。此代码应向一个耳朵发送低音信号,向另一个耳朵发送高音信号但对我而言,它向两个耳朵发送两种信号

我不知道出了什么问题,因为两个都注册了并且都可以访问正确的扬声器。

/** @file simple_client.c
*
* @brief This simple client demonstrates the basic features of JACK
* as they would be used by many applications.
*/

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <signal.h>
#ifndef WIN32
#include <unistd.h>
#endif
#include <jack/jack.h>

jack_port_t *output_port1, *output_port2;
jack_client_t *client;

#ifndef M_PI
#define M_PI  (3.14159265)
#endif

#define TABLE_SIZE   (200)
typedef struct
{
    float sine[TABLE_SIZE];
    int left_phase;
    int right_phase;
}
paTestData;

static void signal_handler(int sig)
{
    jack_client_close(client);
    fprintf(stderr, "signal received, exiting ...\n");
    exit(0);
}

/**
* The process callback for this JACK application is called in a
* special realtime thread once for each audio cycle.
*
* This client follows a simple rule: when the JACK transport is
* running, copy the input port to the output.  When it stops, exit.
*/

int
process(jack_nframes_t nframes, void *arg)
{
    jack_default_audio_sample_t *out1, *out2;
    paTestData *data = (paTestData*)arg;
    int i;

    out1 = (jack_default_audio_sample_t*)jack_port_get_buffer(output_port1, nframes);
    out2 = (jack_default_audio_sample_t*)jack_port_get_buffer(output_port2, nframes);

    for (i = 0; i<nframes; i++)
    {
        out1[i] = data->sine[data->left_phase];  // left 
        out2[i] = data->sine[data->right_phase];  // right 
        data->left_phase += 1;
        if (data->left_phase >= TABLE_SIZE) data->left_phase -= TABLE_SIZE;
        data->right_phase += 10; // higher pitch so we can distinguish left and right. 
        if (data->right_phase >= TABLE_SIZE) data->right_phase -= TABLE_SIZE;
    }

    return 0;
}

/**
* JACK calls this shutdown_callback if the server ever shuts down or
* decides to disconnect the client.
*/
void
jack_shutdown(void *arg)
{
    exit(1);
}

int
main(int argc, char *argv[])
{
    const char **ports;
    const char *client_name;
    const char *server_name = NULL;
    jack_options_t options = JackNullOption;
    jack_status_t status;
    paTestData data;
    int i;

    /*if (argc >= 2) {      // client name specified? 
        client_name = argv[1];
        if (argc >= 3) {    // server name specified? 
            server_name = argv[2];
            int my_option = JackNullOption | JackServerName;
            options = (jack_options_t)my_option;
        }
    }
    else {          // use basename of argv[0]
        client_name = strrchr(argv[0], '/');
        if (client_name == 0) {
            client_name = argv[0];
        }
        else {
            client_name++;
        }
    }*/

    client_name = "mytest";

    for (i = 0; i<TABLE_SIZE; i++)
    {
        data.sine[i] = 0.2 * (float)sin(((double)i / (double)TABLE_SIZE) * M_PI * 2.);
    }
    data.left_phase = data.right_phase = 0;


    // open a client connection to the JACK server 
    client = jack_client_open(client_name, options, &status, server_name);
    if (client == NULL) {
        fprintf(stderr, "jack_client_open() failed, "
            "status = 0x%2.0x\n", status);
        if (status & JackServerFailed) {
            fprintf(stderr, "Unable to connect to JACK server\n");
        }
        exit(1);
    }
    if (status & JackServerStarted) {
        fprintf(stderr, "JACK server started\n");
    }
    if (status & JackNameNotUnique) {
        client_name = jack_get_client_name(client);
        fprintf(stderr, "unique name `%s' assigned\n", client_name);
    }

    // tell the JACK server to call `process()' whenever
    //there is work to be done.


    jack_set_process_callback(client, process, &data);

    // tell the JACK server to call `jack_shutdown()' if
    //it ever shuts down, either entirely, or if it
    //just decides to stop calling us.


    jack_on_shutdown(client, jack_shutdown, 0);

    // create two ports 

    output_port1 = jack_port_register(client, "output1",
        JACK_DEFAULT_AUDIO_TYPE,
        JackPortIsOutput, 0);

    output_port2 = jack_port_register(client, "output2",
        JACK_DEFAULT_AUDIO_TYPE,
        JackPortIsOutput, 0);

    if ((output_port1 == NULL) || (output_port2 == NULL)) {
        fprintf(stderr, "no more JACK ports available\n");
        exit(1);
    }

    //Tell the JACK server that we are ready to roll.  Our
    // process() callback will start running now. 

    if (jack_activate(client)) {
        fprintf(stderr, "cannot activate client");
        exit(1);
    }

    // Connect the ports.  You can't do this before the client is
    // activated, because we can't make connections to clients
    // that aren't running.  Note the confusing (but necessary)
    // orientation of the driver backend ports: playback ports are
    // "input" to the backend, and capture ports are "output" from
    // it.


    ports = jack_get_ports(client, NULL, NULL,
        JackPortIsPhysical | JackPortIsInput);
    if (ports == NULL) {
        fprintf(stderr, "no physical playback ports\n");
        exit(1);
    }

    if (jack_connect(client, jack_port_name(output_port1), ports[0])) {
        fprintf(stderr, "cannot connect output ports\n");
    }

    if (jack_connect(client, jack_port_name(output_port2), ports[1])) {
        fprintf(stderr, "cannot connect output ports\n");
    }

    jack_free(ports);

    // install a signal handler to properly quits jack client 
#ifdef WIN32
    signal(SIGINT, signal_handler);
    signal(SIGABRT, signal_handler);
    signal(SIGTERM, signal_handler);
#else
    signal(SIGQUIT, signal_handler);
    signal(SIGTERM, signal_handler);
    signal(SIGHUP, signal_handler);
    signal(SIGINT, signal_handler);
#endif

    // keep running until the Ctrl+C 

    while (1) {
#ifdef WIN32 
        Sleep(1000);
#else
        sleep(1);
#endif
    }

    jack_client_close(client);
    exit(0);
}

最佳答案

你想过这个吗?我自己对使用 Jack 进行编码和配置 Jack 还很陌生,但我的直觉是,问题不在代码中,而是混音器问题。我怀疑某个地方的某个设置已将插孔服务器置于某种单声道模式,这意味着所有输出流都被 multed(是的拼写检查器,multed 是音频工程世界中的一个词:))到所有物理音频输出。所以...流 1 将连接到左右物理输出,流 2 也将连接到物理左右输出。

没有任何地方必然会说流 1 到左输出而流 2 到右...事实上,如果您正在运行 SDDS 配置,第一个流可能是左输出,并且第二个可能是左中...直到您到达第五个流(第二个,第三个和第四个分别是左中,中和右中),您才能到达右声道。

同样,这只是一个猜测,但请检查您的平台上是否有混音器或“patch bay”式应用程序,允许您将流路由到物理输出。同时,我将在我的系统(Debian unstable/w experimental 4.3 kernel)上运行这段代码,看看会发生什么。

干杯,乔

关于c++ Jackaudio无法获得立体声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29748082/

相关文章:

c++ - macOS 上的 secure_getenv()

用于扩展任意标准符合分配器的 C++ 设计模式

c++ - 带着面具搜索

c++ - 检查网格/真值表的对称性

c++ - 使用#pragma once 和#ifndef 时 VS 2010 C++ LNK2005 错误

c++ - 有运算符时 '=' 没有可行的重载

c - 从 C 读取 Lua 表

ios - 在将音频记录加载到 AVURLAsset 期间发出,然后插入 AVMutableCompositionTrack

audio - Vaadin音频搜寻位置

php - 如何将音频文件(即时)转换为浏览器?