summaryrefslogtreecommitdiffstats
path: root/pica-client/skynet.cpp
diff options
context:
space:
mode:
authorAnton <anton@picapica.im>2026-08-12 22:52:20 +0400
committerAnton <anton@picapica.im>2026-08-12 22:52:20 +0400
commit9c5a67f89a6f90080e171fb6c7bb0964bd9e69f3 (patch)
treefdfac4241af1508608eb40ef60d2c3daf86a897f /pica-client/skynet.cpp
parent386f189f03fc199285716d78a059b790bd1b9a6b (diff)
downloadpica-pica-9c5a67f89a6f90080e171fb6c7bb0964bd9e69f3.tar.gz
pica-pica-9c5a67f89a6f90080e171fb6c7bb0964bd9e69f3.zip
pica-client: voice calls
Diffstat (limited to 'pica-client/skynet.cpp')
-rw-r--r--pica-client/skynet.cpp70
1 files changed, 57 insertions, 13 deletions
diff --git a/pica-client/skynet.cpp b/pica-client/skynet.cpp
index 85a55f6..1cd42bf 100644
--- a/pica-client/skynet.cpp
+++ b/pica-client/skynet.cpp
@@ -811,7 +811,7 @@ void SkyNet::do_AcceptCall(QByteArray from)
ret = PICA_pickup_call(iptr);
if (ret != PICA_OK)
- emit CallFailed(QString(tr("Failed to pickup the call: %1")).arg(ret));
+ emit CallFailed(from, QString(tr("Failed to pickup the call: %1")).arg(ret));
return;
}
@@ -834,7 +834,7 @@ void SkyNet::do_RejectCall(QByteArray from)
ret = PICA_reject_call(iptr);
if (ret != PICA_OK)
- emit CallFailed(QString(tr("Failed to reject the call: %1")).arg(ret));
+ emit CallFailed(from, QString(tr("Failed to reject the call: %1")).arg(ret));
return;
}
@@ -857,13 +857,45 @@ void SkyNet::do_HangupCall(QByteArray with)
ret = PICA_hangup_call(iptr);
if (ret != PICA_OK)
- emit CallFailed(QString(tr("Failed to hang up the call: %1")).arg(ret));
+ emit CallFailed(with, QString(tr("Failed to hang up the call: %1")).arg(ret));
return;
}
}
+void SkyNet::SendAudioParams(QByteArray to, QString codec, quint16 sample_rate)
+{
+ QMetaObject::invokeMethod(this, "do_SendAudioParams", Qt::AutoConnection,
+ Q_ARG(QByteArray, to), Q_ARG(QString, codec), Q_ARG(quint16, sample_rate));
+}
+
+void SkyNet::do_SendAudioParams(QByteArray to, QString codec, quint16 sample_rate)
+{
+ struct PICA_c2c *iptr;
+
+ if ((iptr = find_active_chan(to)))
+ {
+ PICA_set_call_audio_params(iptr, codec.toLatin1().constData(), sample_rate);
+ }
+}
+
+void SkyNet::SendAudioPacket(QByteArray to, quint16 seq_num, quint32 timestamp, QByteArray data)
+{
+ QMetaObject::invokeMethod(this, "do_SendAudioPacket", Qt::AutoConnection,
+ Q_ARG(QByteArray, to), Q_ARG(quint16, seq_num), Q_ARG(quint32, timestamp), Q_ARG(QByteArray, data));
+}
+
+void SkyNet::do_SendAudioPacket(QByteArray to, quint16 seq_num, quint32 timestamp, QByteArray data)
+{
+ struct PICA_c2c *iptr;
+
+ if ((iptr = find_active_chan(to)))
+ {
+ PICA_send_audio_packet(iptr, seq_num, timestamp, data.constData(), data.size());
+ }
+}
+
void SkyNet::StartCall(QByteArray to)
{
QMetaObject::invokeMethod(this, "do_StartCall", Qt::AutoConnection,
@@ -874,7 +906,7 @@ void SkyNet::do_StartCall(QByteArray to)
{
if (!self_aware)
{
- emit CallFailed(QString(tr("Pica Pica client is not online")));
+ emit CallFailed(to, QString(tr("Pica Pica client is not online")));
return;
}
@@ -886,7 +918,7 @@ void SkyNet::do_StartCall(QByteArray to)
ret = PICA_start_call(iptr);
if (ret != PICA_OK)
- emit CallFailed(QString(tr("Failed to initiate the call: %1")).arg(ret));
+ emit CallFailed(to, QString(tr("Failed to initiate the call: %1")).arg(ret));
return;
}
@@ -899,7 +931,7 @@ void SkyNet::do_StartCall(QByteArray to)
ret = PICA_new_c2c(active_nodelink, (const unsigned char*)to.constData(), NULL, &chan);
if (ret != PICA_OK)
- emit CallFailed(QString(tr("Failed to create the C2C connection for the call: %1")).arg(ret));
+ emit CallFailed(to, QString(tr("Failed to create the C2C connection for the call: %1")).arg(ret));
}
bool SkyNet::is_call_waiting_for(const QByteArray &peer_id)
@@ -922,7 +954,7 @@ void SkyNet::continue_start_call()
if (ret != PICA_OK)
{
- emit CallFailed(QString(tr("Failed to initiate the call: %1")).arg(ret));
+ emit CallFailed(call_waiting_to, QString(tr("Failed to initiate the call: %1")).arg(ret));
call_waiting_c2c_connect = false;
}
}
@@ -1120,9 +1152,9 @@ void SkyNet::emit_ConnectionStatusUpdated(QByteArray peer_id, QString status)
emit ConnectionStatusUpdated(peer_id, status);
}
-void SkyNet::emit_CallFailed(QString reason)
+void SkyNet::emit_CallFailed(QByteArray peer_id, QString reason)
{
- emit CallFailed(reason);
+ emit CallFailed(peer_id, reason);
}
void SkyNet::emit_IncomingCall(QByteArray from)
@@ -1145,6 +1177,16 @@ void SkyNet::emit_CallHungup(QByteArray by)
emit CallHungup(by);
}
+void SkyNet::emit_IncomingAudioParams(QByteArray peer_id, QString codec, quint16 sample_rate)
+{
+ emit IncomingAudioParams(peer_id, codec, sample_rate);
+}
+
+void SkyNet::emit_IncomingAudioPacket(QByteArray peer_id, quint16 seq_num, quint32 timestamp, QByteArray data)
+{
+ emit IncomingAudioPacket(peer_id, seq_num, timestamp, data);
+}
+
//callbacks
void SkyNet::newmsg_cb(const unsigned char *peer_id, const char *msgbuf, unsigned int nb, int type)
@@ -1182,7 +1224,7 @@ void SkyNet::c2c_failed(const unsigned char *peer_id)
if (skynet->is_call_waiting_for(peer))
{
- skynet->emit_CallFailed(QString(tr("Failed to establish the C2C connection to %1")).arg(QString(peer.toBase64())));
+ skynet->emit_CallFailed(peer, QString(tr("Failed to establish the C2C connection to %1")).arg(QString(peer.toBase64())));
skynet->call_waiting_c2c_connect = false;
}
}
@@ -1201,7 +1243,7 @@ void SkyNet::notfound_cb(const unsigned char *callee_id)
if (skynet->is_call_waiting_for(peer))
{
- skynet->emit_CallFailed(QString(tr("Requested peer was not found online in the Pica Pica network")));
+ skynet->emit_CallFailed(peer, QString(tr("Requested peer was not found online in the Pica Pica network")));
skynet->call_waiting_c2c_connect = false;
}
}
@@ -1381,16 +1423,18 @@ void SkyNet::call_hangup_cb(const unsigned char *peer_id)
void SkyNet::call_audio_params_cb(const unsigned char *peer_id, const char *codec, uint16_t sample_rate)
{
+ skynet->emit_IncomingAudioParams(QByteArray((const char*)peer_id, PICA_ID_SIZE), QString::fromLatin1(codec), sample_rate);
}
void SkyNet::call_video_params_cb(const unsigned char *peer_id, const char *codec, uint16_t width, uint16_t height)
{
}
-void SkyNet::call_audio_packet_cb(const unsigned char *peer_id, uint16_t size, const char *pkt_data)
+void SkyNet::call_audio_packet_cb(const unsigned char *peer_id, uint16_t seq_num, uint32_t timestamp, uint16_t size, const char *pkt_data)
{
+ skynet->emit_IncomingAudioPacket(QByteArray((const char*)peer_id, PICA_ID_SIZE), seq_num, timestamp, QByteArray(pkt_data, size));
}
-void SkyNet::call_video_packet_cb(const unsigned char *peer_id, uint16_t size, const char *pkt_data)
+void SkyNet::call_video_packet_cb(const unsigned char *peer_id, uint16_t seq_num, uint32_t timestamp, uint16_t size, const char *pkt_data)
{
}