Esempio n. 1
0
void Core::onAvStart(void* _toxav, int32_t call_index, void* core)
{
    ToxAv* toxav = static_cast<ToxAv*>(_toxav);

    int friendId = toxav_get_peer_id(toxav, call_index, 0);
    if (friendId < 0)
    {
        qWarning() << "Core: Received invalid AV start";
        return;
    }

    ToxAvCSettings* transSettings = new ToxAvCSettings;
    int err = toxav_get_peer_csettings(toxav, call_index, 0, transSettings);
    if (err != av_ErrorNone)
    {
        qWarning() << "Core::onAvStart: error getting call type";
        delete transSettings;
        return;
    }

    if (transSettings->call_type == av_TypeVideo)
    {
        qDebug() << QString("Core: AV start from %1 with video").arg(friendId);
        prepareCall(friendId, call_index, toxav, true);
        emit static_cast<Core*>(core)->avStart(friendId, call_index, true);
    }
    else
    {
        qDebug() << QString("Core: AV start from %1 without video").arg(friendId);
        prepareCall(friendId, call_index, toxav, false);
        emit static_cast<Core*>(core)->avStart(friendId, call_index, false);
    }

    delete transSettings;
}
Esempio n. 2
0
void Core::answerCall(int32_t callId)
{
    int friendId = toxav_get_peer_id(toxav, callId, 0);
    if (friendId < 0)
    {
        qWarning() << "Core: Received invalid AV answer peer ID";
        return;
    }

    ToxAvCSettings* transSettings = new ToxAvCSettings;
    int err = toxav_get_peer_csettings(toxav, callId, 0, transSettings);
    if (err != av_ErrorNone)
    {
         qWarning() << "Core::answerCall: error getting call settings";
         delete transSettings;
         return;
    }

    if (transSettings->call_type == av_TypeVideo)
    {
        qDebug() << QString("Core: answering call %1 with video").arg(callId);
        toxav_answer(toxav, callId, transSettings);
    }
    else
    {
        qDebug() << QString("Core: answering call %1 without video").arg(callId);
        toxav_answer(toxav, callId, transSettings);
    }

    delete transSettings;
}
Esempio n. 3
0
int start_transmission(ToxWindow *self)
{
    if ( !ASettins.av || self->call_idx == -1 ) return -1;
    
    /* Don't provide support for video */
    if ( 0 != toxav_prepare_transmission(ASettins.av, self->call_idx, av_jbufdc * 2, av_VADd, 0) ) {
        line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Could not prepare transmission");
    }
    
    if ( !toxav_capability_supported(ASettins.av, self->call_idx, AudioDecoding) ||
         !toxav_capability_supported(ASettins.av, self->call_idx, AudioEncoding) )
        return -1;
    
    set_call(&ASettins.calls[self->call_idx], _True);
        
    ToxAvCSettings csettings;
    toxav_get_peer_csettings(ASettins.av, self->call_idx, 0, &csettings);
    
    if ( open_primary_device(input, &ASettins.calls[self->call_idx].in_idx,
            csettings.audio_sample_rate, csettings.audio_frame_duration, csettings.audio_channels) != de_None ) 
        line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to open input device!");
    
    if ( register_device_callback(self->call_idx, ASettins.calls[self->call_idx].in_idx, 
         read_device_callback, &self->call_idx, _True) != de_None) 
        /* Set VAD as true for all; TODO: Make it more dynamic */
        line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to register input handler!");
    
    if ( open_primary_device(output, &ASettins.calls[self->call_idx].out_idx, 
            csettings.audio_sample_rate, csettings.audio_frame_duration, csettings.audio_channels) != de_None ) {
        line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to open output device!");
        ASettins.calls[self->call_idx].has_output = 0;
    }
    
    return 0;
}
Esempio n. 4
0
void callback_av_audio(ToxAv *av, int32_t call_index, const int16_t *data, uint16_t samples, void *that)
{
    //qDebug() << "was called";
    ToxAvCSettings dest;
    if(toxav_get_peer_csettings(av, call_index, 0, &dest) == 0) {
        audio_play(call_index, data, samples, dest.audio_channels, dest.audio_sample_rate);
    }
}
Esempio n. 5
0
void write_device_callback(ToxAv* av, int32_t call_index, int16_t* data, int size, void* userdata)
{
    (void)userdata;
    if (call_index >= 0 && ASettins.calls[call_index].ttas) {
        ToxAvCSettings csettings = ASettins.cs;
        toxav_get_peer_csettings(av, call_index, 0, &csettings);
        write_out(ASettins.calls[call_index].out_idx, data, size, csettings.audio_channels);
    }
}
Esempio n. 6
0
void Core::playCallAudio(ToxAv* toxav, int32_t callId, int16_t *data, int samples, void *user_data)
{
    Q_UNUSED(user_data);

    if (!calls[callId].active)
        return;

    ToxAvCSettings dest;
    if(toxav_get_peer_csettings(toxav, callId, 0, &dest) == 0)
        playAudioBuffer(callId, data, samples, dest.audio_channels, dest.audio_sample_rate);
}
Esempio n. 7
0
void write_device_callback(void *agent, int32_t call_index, const int16_t* PCM, uint16_t size, void* arg)
{
    (void)arg;
    (void)agent;

    if (call_index >= 0 && ASettins.calls[call_index].ttas) {
        ToxAvCSettings csettings = ASettins.cs;
        toxav_get_peer_csettings(ASettins.av, call_index, 0, &csettings);
        write_out(ASettins.calls[call_index].out_idx, PCM, size, csettings.audio_channels);
    }
}
Esempio n. 8
0
void Core::playCallAudio(void* toxav, int32_t callId, const int16_t *data, uint16_t samples, void *user_data)
{
    Q_UNUSED(user_data);

    if (!calls[callId].active)
        return;

    if (!calls[callId].alSource)
        alGenSources(1, &calls[callId].alSource);

    ToxAvCSettings dest;
    if (toxav_get_peer_csettings((ToxAv*)toxav, callId, 0, &dest) == 0)
        playAudioBuffer(calls[callId].alSource, data, samples, dest.audio_channels, dest.audio_sample_rate);
}
Esempio n. 9
0
void callback_av_start(ToxAv *av, int32_t call_index, void *that)
{
    qDebug() << "was called";
    Cyanide *cyanide = (Cyanide*)that;
    ToxAvCSettings peer_settings;
    int fid = toxav_get_peer_id(av, call_index, 0);
    toxav_get_peer_csettings(av, call_index, 0, &peer_settings);
    bool video = peer_settings.call_type == av_TypeVideo;
    if(toxav_prepare_transmission(av, call_index, 1) == 0) {
        // call started
    } else {
        qDebug() << "toxav_prepare_transmission() failed";
        return;
    }
}
Esempio n. 10
0
void callback_av_invite(ToxAv *av, int32_t call_index, void *that)
{
    qDebug() << "was called";
    Cyanide *cyanide = (Cyanide*)that;

    int fid = toxav_get_peer_id(av, call_index, 0);
    Friend *f = &cyanide->friends[fid];

    ToxAvCSettings peer_settings ;
    toxav_get_peer_csettings(av, call_index, 0, &peer_settings);
    bool video = peer_settings.call_type == av_TypeVideo;

    f->call_index = call_index;
    f->callstate = -2;
    emit cyanide->signal_friend_callstate(fid, f->callstate);
    emit cyanide->signal_av_invite(fid);
}
Esempio n. 11
0
void Core::onAvMediaChange(void* toxav, int32_t callId, void* core)
{
    ToxAvCSettings settings;
    toxav_get_peer_csettings((ToxAv*)toxav, callId, 0, &settings);
    int friendId = toxav_get_peer_id((ToxAv*)toxav, callId, 0);

    qWarning() << "Core: Received media change from friend "<<friendId;

    if (settings.call_type == TypeAudio)
    {
        calls[callId].videoEnabled = false;
        calls[callId].sendVideoTimer->stop();
        Widget::getInstance()->getCamera()->unsuscribe();
        emit ((Core*)core)->avMediaChange(friendId, callId, false);
    }
    else
    {
        Widget::getInstance()->getCamera()->suscribe();
        calls[callId].videoEnabled = true;
        calls[callId].sendVideoTimer->start();
        emit ((Core*)core)->avMediaChange(friendId, callId, true);
    }
}
Esempio n. 12
0
void callback_call_type_change ( void *av, int32_t call_index, void *_arg )
{
    ToxAvCSettings csettings;
    toxav_get_peer_csettings(av, call_index, 0, &csettings);

    printf("New settings: \n"
           "Type: %u \n"
           "Video bitrate: %u \n"
           "Video height: %u \n"
           "Video width: %u \n"
           "Audio bitrate: %u \n"
           "Audio framedur: %u \n"
           "Audio sample rate: %u \n"
           "Audio channels: %u \n",
           csettings.call_type,
           csettings.video_bitrate,
           csettings.max_video_height,
           csettings.max_video_width,
           csettings.audio_bitrate,
           csettings.audio_frame_duration,
           csettings.audio_sample_rate,
           csettings.audio_channels
          );
}
Esempio n. 13
0
void cmd_ccur_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
    const char *error_str;
    
    if ( argc != 2 ) {
        if ( argc < 1 ) error_str = "Type must be specified!";
        else if ( argc < 2 ) error_str = "Must have id!";
        else error_str = "Only two arguments allowed!";
        
        goto on_error;
    }
    
    DeviceType type;
    
    if ( strcmp(argv[1], "in") == 0 ) /* Input devices */
        type = input;
    
    else if ( strcmp(argv[1], "out") == 0 ) /* Output devices */
        type = output;
    
    else {
        line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]);
        return;
    }
    
    
    char *end;
    long int selection = strtol(argv[2], &end, 10);
    
    if ( *end ) {
        error_str = "Invalid input";
        goto on_error;
    }
    
    if ( selection_valid(type, selection) == de_InvalidSelection ) {
        error_str="Invalid selection!";
        goto on_error;
    }
    
    /* If call is active, change device */
    if ( self->call_idx > -1) {
        Call* this_call = &ASettins.calls[self->call_idx];
        if (this_call->ttas) {
            
            ToxAvCSettings csettings;
            toxav_get_peer_csettings(ASettins.av, self->call_idx, 0, &csettings);
            
            if (type == output) {
                pthread_mutex_lock(&this_call->mutex);
                close_device(output, this_call->out_idx);
                this_call->has_output = open_device(output, selection, &this_call->out_idx, 
                    csettings.audio_sample_rate, csettings.audio_frame_duration, csettings.audio_channels) 
                    == de_None ? 1 : 0;
                pthread_mutex_unlock(&this_call->mutex);
            }
            else {
                /* TODO: check for failure */
                close_device(input, this_call->in_idx);
                open_device(input, selection, &this_call->in_idx, csettings.audio_sample_rate, 
                    csettings.audio_frame_duration, csettings.audio_channels);
                /* Set VAD as true for all; TODO: Make it more dynamic */
                register_device_callback(self->call_idx, this_call->in_idx, read_device_callback, &self->call_idx, true);
            }
        }
    }
    
    self->device_selection[type] = selection;
    
    return;
    on_error:
    print_err (self, error_str);
}