Telegram: bump version

* add native notifications
This commit is contained in:
Gerasim Troeglazov
2018-09-04 23:01:19 +10:00
parent 8f4bcce548
commit 096d8155c9
4 changed files with 812 additions and 469 deletions

View File

@@ -1,174 +1,15 @@
From 15130ecca47fcbfd3e15c9ace71b00a669042202 Mon Sep 17 00:00:00 2001
From 957b6bc19b971d44f878a458c441301bd3215185 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Sun, 10 Jun 2018 11:08:42 +1000
Subject: Fix for using external opus lib
Date: Thu, 30 Aug 2018 20:14:24 +1000
Subject: Add Haiku platform
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/OpusDecoder.h b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/OpusDecoder.h
index 6425c97..848b930 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/OpusDecoder.h
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/OpusDecoder.h
@@ -9,7 +9,7 @@
#include "MediaStreamItf.h"
-#include "opus.h"
+#include <opus/opus.h>
#include "threading.h"
#include "BlockingQueue.h"
#include "Buffers.h"
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/OpusEncoder.h b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/OpusEncoder.h
index 4726f6b..92d8c33 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/OpusEncoder.h
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/OpusEncoder.h
@@ -9,7 +9,7 @@
#include "MediaStreamItf.h"
-#include "opus.h"
+#include <opus/opus.h>
#include "threading.h"
#include "BlockingQueue.h"
#include "Buffers.h"
--
2.16.4
From b4be4f2018dcc71fee9682e1f20f2a75799d9902 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Sun, 10 Jun 2018 11:10:12 +1000
Subject: Add haiku modules
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/VoIPController.cpp b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/VoIPController.cpp
index 6d266a5..d08296a 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/VoIPController.cpp
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/VoIPController.cpp
@@ -8,6 +8,9 @@
#include <unistd.h>
#include <sys/time.h>
#endif
+#ifdef __HAIKU__
+#include <OS.h>
+#endif
#include <errno.h>
#include <string.h>
#include <wchar.h>
@@ -2404,6 +2407,10 @@ double VoIPController::GetCurrentTime(){
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return ts.tv_sec+(double)ts.tv_nsec/1000000000.0;
+#elif defined(__HAIKU__)
+ struct timeval tm;
+ gettimeofday(&tm, NULL);
+ return tm.tv_sec+(double)tm.tv_usec/1000000.0;
#elif defined(__APPLE__)
static pthread_once_t token = PTHREAD_ONCE_INIT;
pthread_once(&token, &initMachTimestart);
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/audio/AudioInput.cpp b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/audio/AudioInput.cpp
index 062ca06..887889e 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/audio/AudioInput.cpp
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/audio/AudioInput.cpp
@@ -22,6 +22,8 @@
#elif defined(__linux__)
#include "../os/linux/AudioInputALSA.h"
#include "../os/linux/AudioInputPulse.h"
+#elif defined(__HAIKU__)
+#include "../os/haiku/AudioInputHaiku.h"
#else
#error "Unsupported operating system"
#endif
@@ -64,6 +66,8 @@ AudioInput *AudioInput::Create(std::string deviceID, void* platformSpecific){
LOGW("in: PulseAudio available but not working; trying ALSA");
}
return new AudioInputALSA(deviceID);
+#elif defined(__HAIKU__)
+ return new AudioInputHaiku(deviceID);
#endif
}
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/audio/AudioOutput.cpp b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/audio/AudioOutput.cpp
index 109d24d..c3cc014 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/audio/AudioOutput.cpp
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/audio/AudioOutput.cpp
@@ -25,6 +25,8 @@
#elif defined(__linux__)
#include "../os/linux/AudioOutputALSA.h"
#include "../os/linux/AudioOutputPulse.h"
+#elif defined(__HAIKU__)
+#include "../os/haiku/AudioOutputHaiku.h"
#else
#error "Unsupported operating system"
#endif
@@ -59,6 +61,9 @@ std::unique_ptr<AudioOutput> AudioOutput::Create(std::string deviceID, void* pla
LOGW("out: PulseAudio available but not working; trying ALSA");
}
return std::unique_ptr<AudioOutput>(new AudioOutputALSA(deviceID));
+#elif defined(__HAIKU__)
+ LOGW("out: MediaKitAudio enabled");
+ return std::unique_ptr<AudioOutput>(new AudioOutputHaiku(deviceID));
#endif
}
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/libtgvoip.gyp b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/libtgvoip.gyp
index f236987..24f017b 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/libtgvoip.gyp
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/libtgvoip.gyp
@@ -100,6 +100,14 @@
'<(tgvoip_src_loc)/os/linux/PulseAudioLoader.cpp',
'<(tgvoip_src_loc)/os/linux/PulseAudioLoader.h',
+ # Haiku
+ '<(tgvoip_src_loc)/os/haiku/AudioInputHaiku.cpp',
+ '<(tgvoip_src_loc)/os/haiku/AudioInputHaiku.h',
+ '<(tgvoip_src_loc)/os/haiku/AudioOutputHaiku.cpp',
+ '<(tgvoip_src_loc)/os/haiku/AudioOutputHaiku.h',
+ '<(tgvoip_src_loc)/os/haiku/RingBuffer.cpp',
+ '<(tgvoip_src_loc)/os/haiku/RingBuffer.h',
+
# POSIX
'<(tgvoip_src_loc)/os/posix/NetworkSocketPosix.cpp',
'<(tgvoip_src_loc)/os/posix/NetworkSocketPosix.h',
@@ -253,6 +261,11 @@
'sources/': [['exclude', '<(tgvoip_src_loc)/os/posix/']],
},
],
+ [
+ '"<(OS)" != "haiku"', {
+ 'sources/': [['exclude', '<(tgvoip_src_loc)/os/haiku/']],
+ },
+ ],
[
'"<(OS)" != "mac"', {
'sources/': [['exclude', '<(tgvoip_src_loc)/os/darwin/']],
@@ -378,6 +391,21 @@
},
],
[
+ '"<(OS)" == "haiku"', {
+ 'defines': [
+ 'WEBRTC_POSIX',
+ ],
+ 'cflags_cc': [
+ '-msse2',
+ '-std=gnu++14',
+ ],
+ 'direct_dependent_settings': {
+ 'libraries': [
+
+ ],
+ },
+ },
+ ], [
'"<(OS)" == "linux"', {
'defines': [
'WEBRTC_POSIX',
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.cpp b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.cpp
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioInputHaiku.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioInputHaiku.cpp
new file mode 100644
index 0000000..ce54b6e
index 0000000..1bfbfad
--- /dev/null
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.cpp
@@ -0,0 +1,198 @@
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioInputHaiku.cpp
@@ -0,0 +1,272 @@
+//
+// libtgvoip is free and unencumbered public domain software.
+// For more information, see http://unlicense.org or the UNLICENSE file
@@ -181,36 +22,108 @@ index 0000000..ce54b6e
+#include <dlfcn.h>
+#include "AudioInputHaiku.h"
+#include "../../logging.h"
+#include "../../audio/Resampler.h"
+#include "../../VoIPController.h"
+
+#include "RingBuffer.h"
+
+#define BUFFER_SIZE 960
+
+using namespace tgvoip::audio;
+
+void RecordFile(void* cookie, bigtime_t timestamp, void* data, size_t size, const media_format &format)
+void RecordData(void* cookie, bigtime_t timestamp, void* data, size_t size, const media_format &format)
+{
+ AudioInputHaiku *obj = (AudioInputHaiku*)cookie;
+ if (!obj->IsRecording())
+ AudioInputHaiku *audioInput = (AudioInputHaiku*)cookie;
+ if (!audioInput->IsRecording())
+ return;
+
+ if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_SHORT &&
+ format.u.raw_audio.channel_count == 1) {
+ audioInput->fRingBuffer->Write((unsigned char*)data, size);
+ return;
+ if (format.u.raw_audio.channel_count == 1) {
+ obj->fRingBuffer->Write((unsigned char*)data, size);
+ } else if (format.u.raw_audio.channel_count == 2) {
+ unsigned char *s = (unsigned char*)data;
+ for (int i=0; i<size/4; i++, s+=4)
+ obj->fRingBuffer->Write(s, 2);
+ }
+
+
+ uint32 bytesPerSample = 2;
+ switch (format.u.raw_audio.format) {
+ case media_raw_audio_format::B_AUDIO_CHAR:
+ bytesPerSample = 1;
+ break;
+ case media_raw_audio_format::B_AUDIO_SHORT:
+ bytesPerSample = 2;
+ break;
+ case media_raw_audio_format::B_AUDIO_INT:
+ bytesPerSample = 4;
+ break;
+ case media_raw_audio_format::B_AUDIO_FLOAT:
+ bytesPerSample = 4;
+ break;
+ default:
+ break;
+ }
+
+ int frames = size / (format.u.raw_audio.channel_count * bytesPerSample);
+ int16_t *dst = audioInput->workBuffer;
+
+ if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_CHAR) {
+ unsigned char* src=reinterpret_cast<unsigned char*>(data);
+ for (int n=0; n < frames; n++) {
+ int32_t value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += ((int32_t)(*src) - INT8_MAX) * UINT8_MAX;
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)value;
+ }
+ } else if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_SHORT) {
+ int16_t* src=reinterpret_cast<int16_t*>(data);
+ for (int n=0; n < frames; n++) {
+ int32_t value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += *src;
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)value;
+ }
+ } else if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_INT) {
+ int32_t* src=reinterpret_cast<int32_t*>(data);
+ for (int n=0; n < frames; n++) {
+ int64_t value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += (int64_t)(*src);
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)(value / (UINT16_MAX + 1));
+ }
+ } else if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_FLOAT) {
+ float* src=reinterpret_cast<float*>(data);
+ for (int n=0; n < frames; n++) {
+ float value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += *src;
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)(value*INT16_MAX);
+ }
+ }
+
+ if(format.u.raw_audio.frame_rate != audioInput->tgFrameRate) {
+ size_t len = tgvoip::audio::Resampler::Convert(dst, audioInput->convertBuffer,
+ frames, frames, audioInput->tgFrameRate, format.u.raw_audio.frame_rate) * audioInput->tgBytesPerSample;
+ audioInput->fRingBuffer->Write((unsigned char*)audioInput->convertBuffer, len);
+ } else {
+ audioInput->fRingBuffer->Write((unsigned char*)dst, frames * audioInput->tgBytesPerSample);
+ }
+}
+
+void NotifyRecordFile(void * cookie, BMediaRecorder::notification code, ...)
+void NotifyRecordData(void * cookie, BMediaRecorder::notification code, ...)
+{
+ AudioInputHaiku *audioInput = (AudioInputHaiku*)cookie;
+ if (code == BMediaRecorder::B_WILL_STOP) {
+ if (audioInput->IsRecording()) {
+ audioInput->Stop();
+ }
+ }
+}
+
+AudioInputHaiku::AudioInputHaiku(std::string devID)
+AudioInputHaiku::AudioInputHaiku()
+{
+ fRecorder = NULL;
+ fRingBuffer = NULL;
@@ -287,7 +200,7 @@ index 0000000..ce54b6e
+ }
+ fRecordFormat.type = B_MEDIA_RAW_AUDIO;
+
+ error = fRecorder->SetHooks(RecordFile, NotifyRecordFile, this);
+ error = fRecorder->SetHooks(RecordData, NotifyRecordData, this);
+ if (error < B_OK) {
+ failed=true;
+ return;
@@ -322,7 +235,9 @@ index 0000000..ce54b6e
+}
+
+void AudioInputHaiku::Configure(uint32_t sampleRate, uint32_t bitsPerSample, uint32_t channels){
+
+ tgFrameRate = sampleRate;
+ tgChannelsCount = channels;
+ tgBytesPerSample = bitsPerSample / 8;
+}
+
+bool AudioInputHaiku::IsRecording(){
@@ -367,12 +282,12 @@ index 0000000..ce54b6e
+ snooze(100);
+ }
+}
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.h b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.h
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioInputHaiku.h b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioInputHaiku.h
new file mode 100644
index 0000000..80573df
index 0000000..2425666
--- /dev/null
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.h
@@ -0,0 +1,57 @@
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioInputHaiku.h
@@ -0,0 +1,66 @@
+//
+// libtgvoip is free and unencumbered public domain software.
+// For more information, see http://unlicense.org or the UNLICENSE file
@@ -397,20 +312,29 @@ index 0000000..80573df
+
+#include "RingBuffer.h"
+
+#define BUFFER_SIZE 960
+
+namespace tgvoip{
+namespace audio{
+
+class AudioInputHaiku : public AudioInput{
+
+public:
+ AudioInputHaiku(std::string devID);
+ AudioInputHaiku();
+ virtual ~AudioInputHaiku();
+ virtual void Configure(uint32_t sampleRate, uint32_t bitsPerSample, uint32_t channels);
+ virtual void Start();
+ virtual void Stop();
+ virtual bool IsRecording();
+
+ RingBuffer *fRingBuffer;
+
+ RingBuffer *fRingBuffer;
+ int16_t workBuffer[BUFFER_SIZE * 16];
+ int16_t convertBuffer[BUFFER_SIZE * 16];
+
+ uint32 tgFrameRate;
+ uint32 tgChannelsCount;
+ uint32 tgBytesPerSample;
+
+private:
+ void RunThread(void* arg);
+
@@ -422,20 +346,20 @@ index 0000000..80573df
+ media_format fRecordFormat;
+ media_node fAudioInputNode;
+ media_node fAudioMixerNode;
+
+
+ Thread* thread;
+};
+
+}
+}
+
+#endif //LIBTGVOIP_AUDIOINPUTALSA_H
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.cpp b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.cpp
+#endif //LIBTGVOIP_AUDIOINPUTHAIKU_H
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.cpp
new file mode 100644
index 0000000..4454323
index 0000000..533128d
--- /dev/null
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.cpp
@@ -0,0 +1,101 @@
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.cpp
@@ -0,0 +1,102 @@
+//
+// libtgvoip is free and unencumbered public domain software.
+// For more information, see http://unlicense.org or the UNLICENSE file
@@ -460,7 +384,7 @@ index 0000000..4454323
+}
+
+
+AudioOutputHaiku::AudioOutputHaiku(std::string devID){
+AudioOutputHaiku::AudioOutputHaiku(){
+ soundPlayer = NULL;
+ isPlaying = false;
+ isConfigured = false;
@@ -482,7 +406,7 @@ index 0000000..4454323
+ (uint32)channels,
+ media_raw_audio_format::B_AUDIO_SHORT,
+ B_MEDIA_LITTLE_ENDIAN,
+ (uint32)BUFFER_SIZE * 2 * channels
+ (uint32)BUFFER_SIZE * (bitsPerSample / 8) * channels
+ };
+
+ switch (bitsPerSample) {
@@ -506,6 +430,7 @@ index 0000000..4454323
+ delete soundPlayer;
+ soundPlayer = NULL;
+ isPlaying = false;
+ failed = true;
+ return;
+ }
+
@@ -537,11 +462,11 @@ index 0000000..4454323
+float AudioOutputHaiku::GetLevel(){
+ return 0;
+}
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.h b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.h
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.h b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.h
new file mode 100644
index 0000000..6880709
index 0000000..0ea8230
--- /dev/null
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.h
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.h
@@ -0,0 +1,36 @@
+//
+// libtgvoip is free and unencumbered public domain software.
@@ -562,7 +487,7 @@ index 0000000..6880709
+
+class AudioOutputHaiku : public AudioOutput{
+public:
+ AudioOutputHaiku(std::string devID);
+ AudioOutputHaiku();
+ virtual ~AudioOutputHaiku();
+ virtual void Configure(uint32_t sampleRate, uint32_t bitsPerSample, uint32_t channels);
+ virtual void Start();
@@ -578,12 +503,12 @@ index 0000000..6880709
+}
+}
+
+#endif //LIBTGVOIP_AudioOutputHaiku_H
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/RingBuffer.cpp b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/RingBuffer.cpp
+#endif //LIBTGVOIP_AUDIOOUTPUTHAIKU_H
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/RingBuffer.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/RingBuffer.cpp
new file mode 100644
index 0000000..43236d3
--- /dev/null
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/RingBuffer.cpp
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/RingBuffer.cpp
@@ -0,0 +1,130 @@
+#include <stdio.h>
+#include <stdlib.h>
@@ -715,11 +640,11 @@ index 0000000..43236d3
+{
+ return initialized?B_OK:B_ERROR;
+}
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/RingBuffer.h b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/RingBuffer.h
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/RingBuffer.h b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/RingBuffer.h
new file mode 100644
index 0000000..4715632
--- /dev/null
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/RingBuffer.h
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/RingBuffer.h
@@ -0,0 +1,31 @@
+#ifndef __RING_BUFFER_H__
+#define __RING_BUFFER_H__
@@ -752,38 +677,163 @@ index 0000000..4715632
+};
+
+#endif
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/posix/NetworkSocketPosix.cpp b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/posix/NetworkSocketPosix.cpp
index 05ddbb9..fcf7580 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/posix/NetworkSocketPosix.cpp
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/posix/NetworkSocketPosix.cpp
@@ -47,6 +47,7 @@ NetworkSocketPosix::~NetworkSocketPosix(){
}
void NetworkSocketPosix::SetMaxPriority(){
+#ifndef __HAIKU__
#ifdef __APPLE__
int prio=NET_SERVICE_TYPE_VO;
int res=setsockopt(fd, SOL_SOCKET, SO_NET_SERVICE_TYPE, &prio, sizeof(prio));
@@ -65,6 +66,7 @@ void NetworkSocketPosix::SetMaxPriority(){
LOGE("error setting ip tos: %d / %s", errno, strerror(errno));
}
--
2.16.4
From 753b20ad62db41d0041b352dac9c9a45ecd3009b Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Thu, 30 Aug 2018 20:15:02 +1000
Subject: Fix Haiku build
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/VoIPController.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/VoIPController.cpp
index b82899e..700b0cd 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/VoIPController.cpp
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/VoIPController.cpp
@@ -8,6 +8,9 @@
#include <unistd.h>
#include <sys/time.h>
#endif
+#endif //__HAIKU__
}
+#ifdef __HAIKU__
+#include <OS.h>
+#endif
#include <errno.h>
#include <string.h>
#include <wchar.h>
@@ -2052,6 +2055,10 @@ double VoIPController::GetCurrentTime(){
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return ts.tv_sec+(double)ts.tv_nsec/1000000000.0;
+#elif defined(__HAIKU__)
+ struct timeval tm;
+ gettimeofday(&tm, NULL);
+ return tm.tv_sec+(double)tm.tv_usec/1000000.0;
#elif defined(__APPLE__)
static pthread_once_t token = PTHREAD_ONCE_INIT;
pthread_once(&token, &initMachTimestart);
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioIO.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioIO.cpp
index 06beea7..bae4d64 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioIO.cpp
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioIO.cpp
@@ -37,6 +37,9 @@
#ifndef WITHOUT_PULSE
#include "../os/linux/AudioPulse.h"
#endif
+#elif defined(__HAIKU__)
+#include "../os/haiku/AudioInputHaiku.h"
+#include "../os/haiku/AudioOutputHaiku.h"
#else
#error "Unsupported operating system"
#endif
@@ -62,6 +65,8 @@ shared_ptr<AudioIO> AudioIO::Create(){
return std::make_shared<ContextlessAudioIO<AudioInputWave, AudioOutputWave>>(inputDevice, outputDevice);
#endif
return std::make_shared<ContextlessAudioIO<AudioInputWASAPI, AudioOutputWASAPI>>(inputDevice, outputDevice);
+#elif defined(__HAIKU__)
+ return std::make_shared<ContextlessAudioIO<AudioInputHaiku, AudioOutputHaiku>>();
#elif defined(__linux__)
#ifndef WITHOUT_ALSA
#ifndef WITHOUT_PULSE
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioInput.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioInput.cpp
index 3e3ccb9..a3e4c06 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioInput.cpp
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioInput.cpp
@@ -31,6 +31,8 @@
#ifndef WITHOUT_PULSE
#include "../os/linux/AudioPulse.h"
#endif
+#elif defined(__HAIKU__)
+#include "../os/haiku/AudioInputHaiku.h"
#else
#error "Unsupported operating system"
#endif
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioOutput.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioOutput.cpp
index 938c1aa..36900a8 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioOutput.cpp
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/audio/AudioOutput.cpp
@@ -35,6 +35,8 @@
#include "../os/linux/AudioOutputPulse.h"
#include "../os/linux/AudioPulse.h"
#endif
+#elif defined(__HAIKU__)
+#include "../os/haiku/AudioOutputHaiku.h"
#else
#error "Unsupported operating system"
#endif
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/libtgvoip.gyp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/libtgvoip.gyp
index 0cf04ea..4f21d1e 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/libtgvoip.gyp
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/libtgvoip.gyp
@@ -104,6 +104,14 @@
'<(tgvoip_src_loc)/os/linux/AudioPulse.cpp',
'<(tgvoip_src_loc)/os/linux/AudioPulse.h',
void NetworkSocketPosix::Send(NetworkPacket *packet){
@@ -196,8 +198,10 @@ void NetworkSocketPosix::Open(){
+ # Haiku
+ '<(tgvoip_src_loc)/os/haiku/AudioInputHaiku.cpp',
+ '<(tgvoip_src_loc)/os/haiku/AudioInputHaiku.h',
+ '<(tgvoip_src_loc)/os/haiku/AudioOutputHaiku.cpp',
+ '<(tgvoip_src_loc)/os/haiku/AudioOutputHaiku.h',
+ '<(tgvoip_src_loc)/os/haiku/RingBuffer.cpp',
+ '<(tgvoip_src_loc)/os/haiku/RingBuffer.h',
+
# POSIX
'<(tgvoip_src_loc)/os/posix/NetworkSocketPosix.cpp',
'<(tgvoip_src_loc)/os/posix/NetworkSocketPosix.h',
@@ -257,6 +265,11 @@
'sources/': [['exclude', '<(tgvoip_src_loc)/os/posix/']],
},
],
+ [
+ '"<(OS)" != "haiku"', {
+ 'sources/': [['exclude', '<(tgvoip_src_loc)/os/haiku/']],
+ },
+ ],
[
'"<(OS)" != "mac"', {
'sources/': [['exclude', '<(tgvoip_src_loc)/os/darwin/']],
@@ -382,6 +395,21 @@
},
],
[
+ '"<(OS)" == "haiku"', {
+ 'defines': [
+ 'WEBRTC_POSIX',
+ ],
+ 'cflags_cc': [
+ '-msse2',
+ '-std=gnu++14',
+ ],
+ 'direct_dependent_settings': {
+ 'libraries': [
+
+ ],
+ },
+ },
+ ], [
'"<(OS)" == "linux"', {
'defines': [
'WEBRTC_POSIX',
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/posix/NetworkSocketPosix.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/posix/NetworkSocketPosix.cpp
index ef8d2cb..da39a17 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/posix/NetworkSocketPosix.cpp
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/posix/NetworkSocketPosix.cpp
@@ -202,12 +202,13 @@ void NetworkSocketPosix::Open(){
}
int flag=0;
int res=setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &flag, sizeof(flag));
+#ifndef __HAIKU__
if(res<0){
LOGE("error enabling dual stack socket: %d / %s", errno, strerror(errno));
+#ifndef __HAIKU__
failed=true;
return;
+#endif
}
-
+#endif
SetMaxPriority();
@@ -345,6 +349,8 @@ std::string NetworkSocketPosix::GetLocalInterfaceInfo(IPv4Address *v4addr, IPv6A
int tries=0;
@@ -353,6 +354,8 @@ std::string NetworkSocketPosix::GetLocalInterfaceInfo(IPv4Address *v4addr, IPv6A
if(didAttach){
sharedJVM->DetachCurrentThread();
}
@@ -792,10 +842,10 @@ index 05ddbb9..fcf7580 100644
#else
struct ifaddrs* interfaces;
if(!getifaddrs(&interfaces)){
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/threading.h b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/threading.h
index 0b4933c..87ea3b7 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/threading.h
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/threading.h
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/threading.h b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/threading.h
index 0bcf7c3..af86ef2 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/threading.h
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/threading.h
@@ -33,7 +33,7 @@ namespace tgvoip{
};
}
@@ -805,15 +855,17 @@ index 0b4933c..87ea3b7 100644
#include <pthread.h>
#include <semaphore.h>
@@ -94,11 +94,13 @@ namespace tgvoip{
@@ -115,6 +115,7 @@ namespace tgvoip{
static void* ActualEntryPoint(void* arg){
Thread* self=reinterpret_cast<Thread*>(arg);
if(self->name){
+#ifndef __HAIKU__
#ifndef __APPLE__
#if !defined(__APPLE__) && !defined(__gnu_hurd__)
pthread_setname_np(self->thread, self->name);
#else
pthread_setname_np(self->name);
#elif !defined(__gnu_hurd__)
@@ -123,6 +124,7 @@ namespace tgvoip{
DarwinSpecific::SetCurrentThreadPriority(DarwinSpecific::THREAD_PRIO_USER_INTERACTIVE);
}
#endif
+#endif //__HAKIU__
}
@@ -823,230 +875,72 @@ index 0b4933c..87ea3b7 100644
2.16.4
From 4dbfc02248dde7ae10d29d81f25575942f204c89 Mon Sep 17 00:00:00 2001
From 1bf1510ada4edb23b04da953284b5d1decca9bd0 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Sun, 10 Jun 2018 22:01:28 +1000
Subject: Add mix and resample for haiku audio input
Date: Thu, 30 Aug 2018 23:52:44 +1000
Subject: Remove GetLevel function
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.cpp b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.cpp
index ce54b6e..d7cc39a 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.cpp
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.cpp
@@ -10,32 +10,104 @@
#include <dlfcn.h>
#include "AudioInputHaiku.h"
#include "../../logging.h"
+#include "../../audio/Resampler.h"
#include "../../VoIPController.h"
#include "RingBuffer.h"
-#define BUFFER_SIZE 960
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.cpp
index 533128d..3dc052c 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.cpp
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.cpp
@@ -96,7 +96,3 @@ void AudioOutputHaiku::Stop(){
bool AudioOutputHaiku::IsPlaying(){
return isPlaying;
}
-
using namespace tgvoip::audio;
-void RecordFile(void* cookie, bigtime_t timestamp, void* data, size_t size, const media_format &format)
+void RecordData(void* cookie, bigtime_t timestamp, void* data, size_t size, const media_format &format)
{
- AudioInputHaiku *obj = (AudioInputHaiku*)cookie;
- if (!obj->IsRecording())
+ AudioInputHaiku *audioInput = (AudioInputHaiku*)cookie;
+ if (!audioInput->IsRecording())
+ return;
+
+ if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_SHORT &&
+ format.u.raw_audio.channel_count == 1) {
+ audioInput->fRingBuffer->Write((unsigned char*)data, size);
return;
- if (format.u.raw_audio.channel_count == 1) {
- obj->fRingBuffer->Write((unsigned char*)data, size);
- } else if (format.u.raw_audio.channel_count == 2) {
- unsigned char *s = (unsigned char*)data;
- for (int i=0; i<size/4; i++, s+=4)
- obj->fRingBuffer->Write(s, 2);
}
-
+
+ uint32 bytesPerSample = 2;
+ switch (format.u.raw_audio.format) {
+ case media_raw_audio_format::B_AUDIO_CHAR:
+ bytesPerSample = 1;
+ break;
+ case media_raw_audio_format::B_AUDIO_SHORT:
+ bytesPerSample = 2;
+ break;
+ case media_raw_audio_format::B_AUDIO_INT:
+ bytesPerSample = 4;
+ break;
+ case media_raw_audio_format::B_AUDIO_FLOAT:
+ bytesPerSample = 4;
+ break;
+ default:
+ break;
+ }
+
+ int frames = size / (format.u.raw_audio.channel_count * bytesPerSample);
+ int16_t *dst = audioInput->workBuffer;
+
+ if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_CHAR) {
+ unsigned char* src=reinterpret_cast<unsigned char*>(data);
+ for (int n=0; n < frames; n++) {
+ int32_t value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += ((int32_t)(*src) - INT8_MAX) * UINT8_MAX;
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)value;
+ }
+ } else if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_SHORT) {
+ int16_t* src=reinterpret_cast<int16_t*>(data);
+ for (int n=0; n < frames; n++) {
+ int32_t value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += *src;
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)value;
+ }
+ } else if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_INT) {
+ int32_t* src=reinterpret_cast<int32_t*>(data);
+ for (int n=0; n < frames; n++) {
+ int64_t value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += (int64_t)(*src);
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)(value / (UINT16_MAX + 1));
+ }
+ } else if (format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_FLOAT) {
+ float* src=reinterpret_cast<float*>(data);
+ for (int n=0; n < frames; n++) {
+ float value = 0;
+ for (int j=0; j < format.u.raw_audio.channel_count; j++, src++) {
+ value += *src;
+ }
+ value /= format.u.raw_audio.channel_count;
+ dst[n] = (int16_t)(value*INT16_MAX);
+ }
+ }
+
+ if(format.u.raw_audio.frame_rate != audioInput->tgFrameRate) {
+ size_t len = tgvoip::audio::Resampler::Convert(dst, audioInput->convertBuffer,
+ frames, frames, audioInput->tgFrameRate, format.u.raw_audio.frame_rate) * audioInput->tgBytesPerSample;
+ audioInput->fRingBuffer->Write((unsigned char*)audioInput->convertBuffer, len);
+ } else {
+ audioInput->fRingBuffer->Write((unsigned char*)dst, frames * audioInput->tgBytesPerSample);
+ }
}
-void NotifyRecordFile(void * cookie, BMediaRecorder::notification code, ...)
+void NotifyRecordData(void * cookie, BMediaRecorder::notification code, ...)
{
+ AudioInputHaiku *audioInput = (AudioInputHaiku*)cookie;
if (code == BMediaRecorder::B_WILL_STOP) {
+ if (audioInput->IsRecording()) {
+ audioInput->Stop();
+ }
}
}
@@ -116,7 +188,7 @@ AudioInputHaiku::AudioInputHaiku(std::string devID)
}
fRecordFormat.type = B_MEDIA_RAW_AUDIO;
- error = fRecorder->SetHooks(RecordFile, NotifyRecordFile, this);
+ error = fRecorder->SetHooks(RecordData, NotifyRecordData, this);
if (error < B_OK) {
failed=true;
return;
@@ -151,7 +223,9 @@ AudioInputHaiku::~AudioInputHaiku(){
}
void AudioInputHaiku::Configure(uint32_t sampleRate, uint32_t bitsPerSample, uint32_t channels){
-
+ tgFrameRate = sampleRate;
+ tgChannelsCount = channels;
+ tgBytesPerSample = bitsPerSample / 8;
}
bool AudioInputHaiku::IsRecording(){
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.h b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.h
index 80573df..746d7df 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.h
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioInputHaiku.h
@@ -22,6 +22,8 @@
#include "RingBuffer.h"
+#define BUFFER_SIZE 960
+
namespace tgvoip{
namespace audio{
@@ -34,8 +36,15 @@ public:
-float AudioOutputHaiku::GetLevel(){
- return 0;
-}
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.h b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.h
index 0ea8230..91f2521 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.h
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/os/haiku/AudioOutputHaiku.h
@@ -23,7 +23,6 @@ public:
virtual void Start();
virtual void Stop();
virtual bool IsRecording();
-
- RingBuffer *fRingBuffer;
+
+ RingBuffer *fRingBuffer;
+ int16_t workBuffer[BUFFER_SIZE * 16];
+ int16_t convertBuffer[BUFFER_SIZE * 16];
+
+ uint32 tgFrameRate;
+ uint32 tgChannelsCount;
+ uint32 tgBytesPerSample;
+
virtual bool IsPlaying() override;
- virtual float GetLevel() override;
private:
void RunThread(void* arg);
@@ -47,11 +56,11 @@ private:
media_format fRecordFormat;
media_node fAudioInputNode;
media_node fAudioMixerNode;
-
+
Thread* thread;
};
}
}
-#endif //LIBTGVOIP_AUDIOINPUTALSA_H
+#endif //LIBTGVOIP_AUDIOINPUTHAIKU_H
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.cpp b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.cpp
index 4454323..11650da 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.cpp
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.cpp
@@ -44,7 +44,7 @@ void AudioOutputHaiku::Configure(uint32_t sampleRate, uint32_t bitsPerSample, ui
(uint32)channels,
media_raw_audio_format::B_AUDIO_SHORT,
B_MEDIA_LITTLE_ENDIAN,
- (uint32)BUFFER_SIZE * 2 * channels
+ (uint32)BUFFER_SIZE * (bitsPerSample / 8) * channels
};
switch (bitsPerSample) {
@@ -68,6 +68,7 @@ void AudioOutputHaiku::Configure(uint32_t sampleRate, uint32_t bitsPerSample, ui
delete soundPlayer;
soundPlayer = NULL;
isPlaying = false;
+ failed = true;
return;
}
diff --git a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.h b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.h
index 6880709..6a463fa 100644
--- a/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.h
+++ b/libtgvoip-697eea96aa90205db4fc368df4127eef56b2a5c6/os/haiku/AudioOutputHaiku.h
@@ -33,4 +33,4 @@ private:
}
}
-#endif //LIBTGVOIP_AudioOutputHaiku_H
+#endif //LIBTGVOIP_AUDIOOUTPUTHAIKU_H
bool isPlaying;
bool isConfigured;
--
2.16.4
From 50540bcbe0cd11cf96cf6b095d99e2ed5ab36d30 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Thu, 30 Aug 2018 23:53:16 +1000
Subject: Fix opus includes
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/OpusDecoder.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/OpusDecoder.cpp
index 87a48eb..545113a 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/OpusDecoder.cpp
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/OpusDecoder.cpp
@@ -10,7 +10,7 @@
#include <assert.h>
#include <math.h>
#include <algorithm>
-#ifdef HAVE_CONFIG_H
+#if defined(HAVE_CONFIG_H) || defined(__HAIKU__)
#include <opus/opus.h>
#else
#include "opus.h"
diff --git a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/OpusEncoder.cpp b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/OpusEncoder.cpp
index e30f814..c31aee2 100644
--- a/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/OpusEncoder.cpp
+++ b/libtgvoip-bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34/OpusEncoder.cpp
@@ -8,7 +8,7 @@
#include <assert.h>
#include "logging.h"
#include "VoIPServerConfig.h"
-#ifdef HAVE_CONFIG_H
+#if defined(HAVE_CONFIG_H) || defined(__HAIKU__)
#include <opus/opus.h>
#else
#include "opus.h"
--
2.16.4

View File

@@ -2469,3 +2469,429 @@ index 1928257..4ce6ac6 100644
--
2.16.4
From 95c36a14498a6ede405420d45bbeeb46df5d8d7e Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Tue, 4 Sep 2018 22:57:02 +1000
Subject: Add native notifations
diff --git a/Telegram/SourceFiles/platform/haiku/notifications_haiku_gate.cpp b/Telegram/SourceFiles/platform/haiku/notifications_haiku_gate.cpp
new file mode 100644
index 0000000..bf9c7be
--- /dev/null
+++ b/Telegram/SourceFiles/platform/haiku/notifications_haiku_gate.cpp
@@ -0,0 +1,40 @@
+#include <Application.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#define APPSIGNATURE "application/x-vnd.tg-notify-gate"
+
+class SimpleLauncherApp : public BApplication {
+ public:
+ SimpleLauncherApp(int argc, char **argv);
+ void ArgvReceived(int32 argc, char **argv);
+ virtual void ReadyToRun();
+};
+
+SimpleLauncherApp::SimpleLauncherApp(int argc, char **argv) : BApplication(APPSIGNATURE)
+{
+}
+
+void
+SimpleLauncherApp::ArgvReceived(int32 argc, char **argv)
+{
+ if (argc==2) {
+ FILE *out=fopen("/tmp/tg_notify","wt");
+ fprintf(out,"%s\n", argv[1]);
+ fclose(out);
+ }
+}
+
+void
+SimpleLauncherApp::ReadyToRun()
+{
+ Quit();
+}
+
+int main(int argc, char **argv)
+{
+ SimpleLauncherApp application(argc, argv);
+ application.Run();
+ return 0;
+}
diff --git a/Telegram/SourceFiles/platform/haiku/notifications_haiku_gate.rdef b/Telegram/SourceFiles/platform/haiku/notifications_haiku_gate.rdef
new file mode 100644
index 0000000..b6f3490
--- /dev/null
+++ b/Telegram/SourceFiles/platform/haiku/notifications_haiku_gate.rdef
@@ -0,0 +1,13 @@
+resource app_flags B_MULTIPLE_LAUNCH | B_BACKGROUND_APP;
+
+resource app_version {
+ major = 0,
+ middle = 0,
+ minor = 1,
+ variety = B_APPV_FINAL,
+ internal = 0,
+ short_info = "tg-notify-gate",
+ long_info = "Telegram native notifications gate"
+};
+
+resource app_signature "application/x-vnd.tg-notify-gate";
diff --git a/Telegram/SourceFiles/platform/haiku/notifications_manager_haiku.cpp b/Telegram/SourceFiles/platform/haiku/notifications_manager_haiku.cpp
index b3d186a..8a75ed7 100644
--- a/Telegram/SourceFiles/platform/haiku/notifications_manager_haiku.cpp
+++ b/Telegram/SourceFiles/platform/haiku/notifications_manager_haiku.cpp
@@ -18,65 +18,197 @@ to link the code of portions of this program with the OpenSSL library.
Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
#include "platform/haiku/notifications_manager_haiku.h"
#include "window/notifications_utilities.h"
#include "lang/lang_keys.h"
#include "history/history.h"
+#include <QProcess>
+#include <QThread>
+#include <QObject>
+#include <QString>
+#include <QStringList>
+
namespace Platform {
namespace Notifications {
namespace {
-bool LibNotifyLoaded() {
- return false;
-}
-
-QString escapeHtml(const QString &text) {
- auto result = QString();
- auto copyFrom = 0, textSize = text.size();
- auto data = text.constData();
- for (auto i = 0; i != textSize; ++i) {
- auto ch = data[i];
- if (ch == '<' || ch == '>' || ch == '&') {
- if (!copyFrom) {
- result.reserve(textSize * 5);
- }
- if (i > copyFrom) {
- result.append(data + copyFrom, i - copyFrom);
- }
- switch (ch.unicode()) {
- case '<': result.append(qstr("&lt;")); break;
- case '>': result.append(qstr("&gt;")); break;
- case '&': result.append(qstr("&amp;")); break;
- }
- copyFrom = i + 1;
+} // namespace
+
+bool Supported() {
+ return true;
+}
+
+std::unique_ptr<Window::Notifications::Manager> Create(Window::Notifications::System *system) {
+ if (Global::NativeNotifications() && Supported()) {
+ auto result = std::make_unique<Manager>(system);
+ if (result->init()) {
+ return std::move(result);
}
}
- if (copyFrom > 0) {
- result.append(data + copyFrom, textSize - copyFrom);
- return result;
+ return nullptr;
+}
+
+void Finish() {
+}
+
+NotifyReader::NotifyReader()
+{
+ unlink(NOTIFY_FIFO_NAME);
+ mkfifo(NOTIFY_FIFO_NAME, 0666);
+}
+
+NotifyReader::~NotifyReader()
+{
+ unlink(NOTIFY_FIFO_NAME);
+}
+
+void NotifyReader::run()
+{
+ char line[256];
+ size_t n;
+
+ for(;;) {
+ FILE *in=fopen(NOTIFY_FIFO_NAME, "rt");
+ fgets(line, sizeof line, in);
+ if (line[strlen(line)-1] == '\n') {
+ uint64 peerid = 0;
+ int32 msgid = 0;
+ QString paramsString = QString(line);
+ QStringList paramsList = paramsString.split(' ');
+ if (paramsList.count() == 2) {
+ bool peerStatus, msgStatus;
+ peerid = paramsList[0].toULongLong(&peerStatus, 16);
+ msgid = paramsList[1].toInt(&msgStatus, 16);
+ if (peerStatus & msgStatus)
+ notificationActivated(peerid, msgid);
+ }
+ }
+ fclose(in);
+ }
+}
+
+Manager::Private::Private(Manager *instance, Type type)
+: _guarded(std::make_shared<Manager*>(instance))
+, _cachedUserpics(type) {
+ _weak = _guarded;
+}
+
+bool Manager::Private::init() {
+ pipeReaderThread = new QThread;
+ pipeReader = new NotifyReader();
+ pipeReader->moveToThread(pipeReaderThread);
+ connect(pipeReaderThread, SIGNAL(started()), pipeReader, SLOT(run()));
+ qRegisterMetaType<PeerId>("PeerId");
+ qRegisterMetaType<MsgId>("MsgId");
+ connect(pipeReader, SIGNAL(notificationActivated(PeerId, MsgId)), \
+ this, SLOT(notificationActivatedSlot(PeerId, MsgId)));
+ pipeReaderThread->start();
+ return true;
+}
+
+Manager::Private::~Private() {
+ clearAll();
+}
+
+void Manager::Private::clearAll() {
+}
+
+void Manager::Private::clearFromHistory(History *history) {
+}
+
+void Manager::Private::beforeNotificationActivated(PeerId peerId, MsgId msgId) {
+}
+
+void Manager::Private::afterNotificationActivated(PeerId peerId, MsgId msgId) {
+}
+
+void Manager::Private::clearNotification(PeerId peerId, MsgId msgId) {
+}
+
+bool Manager::Private::showNotification(PeerData *peer, MsgId msgId, const QString &title, \
+ const QString &subtitle, const QString &msg, bool hideNameAndPhoto, bool hideReplyButton) {
+ auto titleText = title;
+ auto subtitleText = subtitle;
+ auto msgText = msg;
+
+ StorageKey key;
+ if (hideNameAndPhoto) {
+ key = StorageKey(0, 0);
+ } else {
+ key = peer->userpicUniqueKey();
}
- return text;
+
+ auto userpicPath = _cachedUserpics.get(key, peer);
+
+ QString program = "/bin/notify";
+ QStringList arguments;
+ arguments << "--icon" << userpicPath;
+ arguments << "--group" << "Telegram";
+ arguments << "--title" << titleText;
+ arguments << "--onClickFile" << NOTIFY_GATE_NAME;
+ arguments << "--onClickArgv" << QString("0x%1 0x%2").arg(peer->id, 0, 16).arg(msgId, 0, 16);
+ arguments << msgText;
+
+ QProcess *notifyProcess = new QProcess();
+ notifyProcess->start(program, arguments);
+
+ return true;
+}
+
+void Manager::Private::notificationActivatedSlot(PeerId _peerId, MsgId _msgId)
+{
+ qDebug() << _peerId << _msgId;
+ performOnMainQueue([peerId = _peerId, msgId = _msgId](Manager *manager) {
+ manager->notificationActivated(peerId, msgId);
+ });
}
+Manager::Manager(Window::Notifications::System *system) : NativeManager(system)
+, _private(std::make_unique<Private>(this, Private::Type::Rounded)) {
+}
+bool Manager::init() {
+ return _private->init();
+}
-} // namespace
+void Manager::clearNotification(PeerId peerId, MsgId msgId) {
+ _private->clearNotification(peerId, msgId);
+}
-bool Supported() {
- return false;
+Manager::~Manager() = default;
+
+void Manager::doShowNativeNotification(PeerData *peer, MsgId msgId, const QString &title, \
+ const QString &subtitle, const QString &msg, bool hideNameAndPhoto, bool hideReplyButton) {
+ _private->showNotification(peer, msgId, title, subtitle, msg, hideNameAndPhoto, hideReplyButton);
}
-std::unique_ptr<Window::Notifications::Manager> Create(Window::Notifications::System *system) {
- return nullptr;
+void Manager::doClearAllFast() {
+ _private->clearAll();
}
-void Finish() {
+void Manager::doClearFromHistory(History *history) {
+ _private->clearFromHistory(history);
+}
+void Manager::onBeforeNotificationActivated(PeerId peerId, MsgId msgId) {
+ _private->beforeNotificationActivated(peerId, msgId);
}
+void Manager::onAfterNotificationActivated(PeerId peerId, MsgId msgId) {
+ _private->afterNotificationActivated(peerId, msgId);
+}
+bool Manager::hasActionsSupport() const {
+ return _private->hasActionsSupport();
+}
} // namespace Notifications
} // namespace Platform
diff --git a/Telegram/SourceFiles/platform/haiku/notifications_manager_haiku.h b/Telegram/SourceFiles/platform/haiku/notifications_manager_haiku.h
index d70bcff..53491b6 100644
--- a/Telegram/SourceFiles/platform/haiku/notifications_manager_haiku.h
+++ b/Telegram/SourceFiles/platform/haiku/notifications_manager_haiku.h
@@ -21,6 +21,14 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
#pragma once
#include "platform/platform_notifications_manager.h"
+#include "window/notifications_utilities.h"
+
+#include <QProcess>
+#include <QThread>
+#include <QObject>
+
+#define NOTIFY_FIFO_NAME "/tmp/tg_notify"
+#define NOTIFY_GATE_NAME "/bin/tg-notify-gate"
namespace Platform {
namespace Notifications {
@@ -38,25 +46,80 @@ inline void FlashBounce() {
void Finish();
+class NotifyReader:public QObject {
+ Q_OBJECT
+public:
+ NotifyReader();
+ ~NotifyReader();
+public slots:
+ void run();
+signals:
+ void notificationActivated(PeerId peerId, MsgId msgId);
+private:
+ int pipeFD;
+};
+
+
class Manager : public Window::Notifications::NativeManager {
public:
Manager(Window::Notifications::System *system);
+ bool init();
+
void clearNotification(PeerId peerId, MsgId msgId);
- bool hasPoorSupport() const;
- bool hasActionsSupport() const;
~Manager();
protected:
- void doShowNativeNotification(PeerData *peer, MsgId msgId, const QString &title, const QString &subtitle, const QString &msg, bool hideNameAndPhoto, bool hideReplyButton) override;
+ void doShowNativeNotification(PeerData *peer, MsgId msgId, const QString &title, \
+ const QString &subtitle, const QString &msg, bool hideNameAndPhoto, bool hideReplyButton) override;
void doClearAllFast() override;
void doClearFromHistory(History *history) override;
+ void onBeforeNotificationActivated(PeerId peerId, MsgId msgId) override;
+ void onAfterNotificationActivated(PeerId peerId, MsgId msgId) override;
+
+ bool hasActionsSupport() const;
private:
class Private;
const std::unique_ptr<Private> _private;
+};
+class Manager::Private : public QObject {
+ Q_OBJECT
+public:
+ using Type = Window::Notifications::CachedUserpics::Type;
+ explicit Private(Manager *instance, Type type);
+ bool init();
+
+ bool showNotification(PeerData *peer, MsgId msgId, const QString &title, const QString &subtitle, \
+ const QString &msg, bool hideNameAndPhoto, bool hideReplyButton);
+ void clearAll();
+ void clearFromHistory(History *history);
+ void beforeNotificationActivated(PeerId peerId, MsgId msgId);
+ void afterNotificationActivated(PeerId peerId, MsgId msgId);
+ void clearNotification(PeerId peerId, MsgId msgId);
+
+ bool hasActionsSupport() const {
+ return true;
+ }
+
+ void performOnMainQueue(FnMut<void(Manager *manager)> task) {
+ const auto weak = _weak;
+ crl::on_main(weak, [=, task = std::move(task)]() mutable {
+ task(*weak.lock());
+ });
+ }
+
+ ~Private();
+public slots:
+ void notificationActivatedSlot(PeerId peerId, MsgId msgId);
+private:
+ Window::Notifications::CachedUserpics _cachedUserpics;
+ std::shared_ptr<Manager*> _guarded;
+ std::weak_ptr<Manager*> _weak;
+ QThread *pipeReaderThread;
+ NotifyReader *pipeReader;
};
} // namespace Notifications
diff --git a/Telegram/SourceFiles/settings/settings_notifications_widget.cpp b/Telegram/SourceFiles/settings/settings_notifications_widget.cpp
index 62bbe64..f0c06f9 100644
--- a/Telegram/SourceFiles/settings/settings_notifications_widget.cpp
+++ b/Telegram/SourceFiles/settings/settings_notifications_widget.cpp
@@ -69,7 +69,7 @@ void NotificationsWidget::createNotificationsControls() {
if (Platform::Notifications::Supported()) {
#ifdef Q_OS_WIN
nativeNotificationsLabel = lang(lng_settings_use_windows);
-#elif defined Q_OS_LINUX64 || defined Q_OS_LINUX32 // Q_OS_WIN
+#elif defined Q_OS_LINUX64 || defined Q_OS_LINUX32 || defined Q_OS_HAIKU // Q_OS_WIN
nativeNotificationsLabel = lang(lng_settings_use_native_notifications);
#endif // Q_OS_WIN || Q_OS_LINUX64 || Q_OS_LINUX32
}
--
2.16.4

View File

@@ -4,27 +4,42 @@ HOMEPAGE="https://www.telegram.org/"
COPYRIGHT="2013-2018 Telegram"
LICENSE="GNU GPL v3"
REVISION="1"
SOURCE_URI="https://github.com/telegramdesktop/tdesktop/archive/v$portVersion.tar.gz"
CHECKSUM_SHA256="4d19fdc85f0c792c6c073062dacf707fc976581a8d249fa91757015cceb7662b"
CHECKSUM_SHA256="83daeded641f79bd370b5e83be88242ab57520e7754f1371a9e5c1f3d9863f2a"
SOURCE_FILENAME="tdesktop-$portVersion.tar.gz"
SOURCE_DIR="tdesktop-$portVersion"
srcGitRev_2="697eea96aa90205db4fc368df4127eef56b2a5c6"
SOURCE_URI_2="https://github.com/telegramdesktop/libtgvoip/archive/$srcGitRev_2.zip"
CHECKSUM_SHA256_2="3028061037a181c1ae9088a1f8e6ae8524858b647f218370323dff33fcfeebb9"
srcGitRev_2="bfa1e6ab76a467c6c6bff7eabb7c213acc7a1b34"
SOURCE_URI_2="https://github.com/telegramdesktop/libtgvoip/archive/$srcGitRev_2.tar.gz"
SOURCE_FILENAME_2="libtgvoip-$srcGitRev_2.tar.gz"
CHECKSUM_SHA256_2="74cf9046687e88ab6074e8f8946da53d95b11abb34a51db1f042ab0ae14f1b91"
srcGitRev_3="550ac2f159ca883d360c196149b466955c77a573"
SOURCE_URI_3="https://github.com/mapbox/variant/archive/$srcGitRev_3.zip"
CHECKSUM_SHA256_3="3676117c49db1ef1ff2818f6f70713c3a4469f0da8ecb5c98c157499322501fc"
SOURCE_URI_3="https://github.com/mapbox/variant/archive/$srcGitRev_3.tar.gz"
SOURCE_FILENAME_3="variant-$srcGitRev_3.tar.gz"
CHECKSUM_SHA256_3="aa794dfefe0a90501587e36d977b958d0df888503117a8d9aa43dc14f8526d9d"
srcGitRev_4="d846fe50a3f0bb7767c7e087a05f4be95f4da0ec"
SOURCE_URI_4="https://github.com/Microsoft/GSL/archive/$srcGitRev_4.zip"
CHECKSUM_SHA256_4="320e2d7707aaa6f7bcc0d6ddc95e2e4413b433ddcc1c8afa0a93fb85a47db47b"
SOURCE_URI_4="https://github.com/Microsoft/GSL/archive/$srcGitRev_4.tar.gz"
SOURCE_FILENAME_4="GSL-$srcGitRev_4.tar.gz"
CHECKSUM_SHA256_4="be81db4ab1b57102a0fa1cd0c4a6469294eb9daf24294347592245b754f65ff6"
srcGitRev_5="5ca44b68721833ae3731802ed99af67c6f38a53a"
SOURCE_URI_5="https://github.com/philsquared/Catch/archive/$srcGitRev_5.zip"
CHECKSUM_SHA256_5="bec93e64dea2dd0c6662a75a81cdd1747a753ccd86025ef436b7d2fac3b408d2"
SOURCE_URI_5="https://github.com/philsquared/Catch/archive/$srcGitRev_5.tar.gz"
SOURCE_FILENAME_5="Catch-$srcGitRev_5.tar.gz"
CHECKSUM_SHA256_5="d24e6d9df2b8aa5739d3b9077c6b0ff0ef4d5ef8acc52c3a57e32893854d8d18"
srcGitRev_6="527ad273b683d52c5adf5b45b73c6466aa0d0cf0"
SOURCE_URI_6="https://github.com/telegramdesktop/crl/archive/$srcGitRev_6.zip"
CHECKSUM_SHA256_6="a52c86d3d0cb21c20ed81d4d81b61a5bc4fbb5eaef407a8fe9ea5cae89e80345"
SOURCE_URI_6="https://github.com/telegramdesktop/crl/archive/$srcGitRev_6.tar.gz"
SOURCE_FILENAME_6="crl-$srcGitRev_6.tar.gz"
CHECKSUM_SHA256_6="d7e64fc8a2e284a5be8c0b0c6e7bfbaf951751081919829cb3bb290544c732e8"
srcGitRev_7="4b10be9cbadd7d0880437f48f875185589fd86d3"
SOURCE_URI_7="https://github.com/ericniebler/range-v3/archive/$srcGitRev_7.zip"
CHECKSUM_SHA256_7="67095606bd533dcffefb6a9ae6be0dc5176d77912928b60ad4e60cc66fc611c7"
SOURCE_URI_7="https://github.com/ericniebler/range-v3/archive/$srcGitRev_7.tar.gz"
SOURCE_FILENAME_7="range-$srcGitRev_7.tar.gz"
CHECKSUM_SHA256_7="86f6b8a2e2d8196d62312042af1953d0b16935550130a73ae0ec69f623b0b947"
PATCHES="
telegram_desktop-$portVersion-systemqt.patch
telegram_desktop-$portVersion.patchset
@@ -40,6 +55,7 @@ SECONDARY_ARCHITECTURES="x86"
PROVIDES="
telegram_desktop$secondaryArchSuffix = $portVersion
app:Telegram$secondaryArchSuffix
cmd:tg_notify_gate
"
REQUIRES="
haiku$secondaryArchSuffix
@@ -111,11 +127,18 @@ BUILD()
Telegram/gyp/refresh.sh ; cd out/Release
# multi-job takes too much memory
make
#build notify gate tool
gcc -o tg-notify-gate $sourceDir/Telegram/SourceFiles/platform/haiku/notifications_haiku_gate.cpp -lbe
rc -o tg-notify-gate.rsrc $sourceDir/Telegram/SourceFiles/platform/haiku/notifications_haiku_gate.rdef
xres -o tg-notify-gate tg-notify-gate.rsrc
mimeset --all tg-notify-gate
}
INSTALL()
{
mkdir -p $appsDir
mkdir -p $appsDir $prefix/bin
cp out/Release/tg-notify-gate $prefix/bin
cp out/Release/Telegram $appsDir
strip $appsDir/Telegram