示例#1
0
void
OpenSLLayer::startStream()
{
    dcblocker_.reset();

    if (isStarted_)
        return;

    DEBUG("Start OpenSL audio layer");

    std::vector<int32_t> hw_infos = Manager::instance().getClient()->getConfigurationManager()->getHardwareAudioFormat();
    hardwareFormat_ = AudioFormat(hw_infos[0], 1);  // Mono on Android
    hardwareBuffSize_ = hw_infos[1];

    for(auto& buf : playbackBufferStack_)
        buf.resize(hardwareBuffSize_);
    for(auto& buf : recordBufferStack_)
        buf.resize(hardwareBuffSize_);

    hardwareFormatAvailable(hardwareFormat_);

    std::thread launcher([this](){
        init();
        startAudioPlayback();
        startAudioCapture();
        isStarted_ = true;
    });
    launcher.detach();
}
示例#2
0
void
PortAudioLayer::init()
{
    RING_DBG("Init PortAudioLayer");
    const auto err = Pa_Initialize();
    if (err != paNoError) {
        this->handleError(err);
        this->terminate();
    }

    indexOut_ = indexRing_ = Pa_GetDefaultOutputDevice();
    indexIn_ = Pa_GetDefaultInputDevice();

    if (indexOut_ != paNoDevice) {
        const auto outputDeviceInfo = Pa_GetDeviceInfo(indexOut_);
        audioFormat_.nb_channels = outputDeviceInfo->maxOutputChannels;
        audioFormat_.sample_rate = outputDeviceInfo->defaultSampleRate;
        hardwareFormatAvailable(audioFormat_);
    }

    if (indexIn_ != paNoDevice) {
        const auto inputDeviceInfo = Pa_GetDeviceInfo(indexIn_);
        audioInputFormat_.nb_channels = inputDeviceInfo->maxInputChannels;
        audioInputFormat_.sample_rate = inputDeviceInfo->defaultSampleRate;
        hardwareInputFormatAvailable(audioInputFormat_);
    }
}
示例#3
0
/**
 * Start the capture and playback.
 */
void
JackLayer::startStream()
{
    {
        std::lock_guard<std::mutex> lock(mutex_);
        if (status_ != Status::Idle)
            return;
        status_ = Status::Started;
    }

    dcblocker_.reset();
    const auto hardwareFormat = AudioFormat(playbackBuffer_.getSampleRate(), out_ports_.size());
    hardwareFormatAvailable(hardwareFormat);

    if (jack_activate(playbackClient_) or jack_activate(captureClient_)) {
        RING_ERR("Could not activate JACK client");
        return;
    }
    ringbuffer_thread_ = std::thread(&JackLayer::ringbuffer_worker, this);

    connectPorts(playbackClient_, JackPortIsInput, out_ports_);
    connectPorts(captureClient_, JackPortIsOutput, in_ports_);
}