Files
haikuports/media-video/avidemux/patches/avidemux-2.7.1.patchset
2018-07-12 22:08:15 +10:00

910 lines
23 KiB
Plaintext

From 4917eb9bb1aff46411495834169fe4bcd9128636 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Wed, 11 Jul 2018 22:46:06 +1000
Subject: Fix build for Haiku
diff --git a/avidemux_core/ADM_core/include/ADM_crashdump_other.h b/avidemux_core/ADM_core/include/ADM_crashdump_other.h
index 6deba1e..1866602 100644
--- a/avidemux_core/ADM_core/include/ADM_crashdump_other.h
+++ b/avidemux_core/ADM_core/include/ADM_crashdump_other.h
@@ -1,4 +1,4 @@
-#if !defined(__APPLE__) && !defined(__unix__) && !defined(__MINGW32__) && !defined ADM_CRASHDUMP_OTHER_H
+#if !defined(__APPLE__) && !defined(__HAIKU__) && !defined(__unix__) && !defined(__MINGW32__) && !defined ADM_CRASHDUMP_OTHER_H
#define ADM_CRASHDUMP_OTHER_H
#define installSigHandler(...) {}
diff --git a/avidemux_core/ADM_core/src/ADM_crashdump_unix.cpp b/avidemux_core/ADM_core/src/ADM_crashdump_unix.cpp
index a2f1375..b4b6fd2 100644
--- a/avidemux_core/ADM_core/src/ADM_crashdump_unix.cpp
+++ b/avidemux_core/ADM_core/src/ADM_crashdump_unix.cpp
@@ -40,8 +40,13 @@
static ADM_saveFunction *mysaveFunction=NULL;
static ADM_fatalFunction *myFatalFunction=NULL;
static ADM_sigIntFunction *mySigIntFunction=NULL;
+#ifdef __HAIKU__
+static __sighandler_t oldSignalHandlerSigInt;
+static __sighandler_t oldSignalHandlerSigSev;
+#else
static sighandler_t oldSignalHandlerSigInt;
static sighandler_t oldSignalHandlerSigSev;
+#endif
void sig_segfault_handler(int signo);
void sig_sigint_handler(int signo);
diff --git a/avidemux_core/ADM_core/src/ADM_folder_linux.cpp b/avidemux_core/ADM_core/src/ADM_folder_linux.cpp
index 686e85a..3625d55 100644
--- a/avidemux_core/ADM_core/src/ADM_folder_linux.cpp
+++ b/avidemux_core/ADM_core/src/ADM_folder_linux.cpp
@@ -39,7 +39,11 @@ static std::string ADM_i18nDir;
static std::string canonize(const std::string &in)
{
std::string out;
+#ifdef __HAIKU__
+ char *simple2=realpath(in.c_str(), NULL);
+#else
char *simple2=canonicalize_file_name(in.c_str());
+#endif
if(simple2)
{
out=std::string(simple2)+std::string("/");
diff --git a/avidemux_core/CMakeLists.txt b/avidemux_core/CMakeLists.txt
index ba31722..b00ea2d 100644
--- a/avidemux_core/CMakeLists.txt
+++ b/avidemux_core/CMakeLists.txt
@@ -52,7 +52,7 @@ checkFtello()
MESSAGE(STATUS "Checking for sqlite")
MESSAGE(STATUS "*******************")
-IF (UNIX)
+IF (UNIX AND NOT HAIKU)
SET(SQLITE_REQUIRED_FLAGS "-ldl")
ENDIF (UNIX)
diff --git a/cmake/cmake_compile_check/execinfo.cpp b/cmake/cmake_compile_check/execinfo.cpp
index 00304cf..07077fa 100644
--- a/cmake/cmake_compile_check/execinfo.cpp
+++ b/cmake/cmake_compile_check/execinfo.cpp
@@ -2,36 +2,8 @@
#include <stdio.h>
#include <stdlib.h>
-/* Obtain a backtrace and print it to stdout. */
-void
-print_trace (void)
-{
- void *array[10];
- size_t size;
- char **strings;
- size_t i;
-
- size = backtrace (array, 10);
- strings = backtrace_symbols (array, size);
-
- printf ("Obtained %zd stack frames.\n", size);
-
- for (i = 0; i < size; i++)
- printf ("%s\n", strings[i]);
-
- free (strings);
-}
-
-/* A dummy function to make the backtrace more interesting. */
-void
-dummy_function (void)
-{
- print_trace ();
-}
-
int
main (void)
{
- dummy_function ();
return 0;
}
--
2.16.4
From 34e3741c54d6b8941849ed96833ea8b058408397 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Thu, 12 Jul 2018 00:09:37 +1000
Subject: Fix build 2
diff --git a/avidemux/common/main.cpp b/avidemux/common/main.cpp
old mode 100755
new mode 100644
index cb2b34b..80cfaa0
--- a/avidemux/common/main.cpp
+++ b/avidemux/common/main.cpp
@@ -60,7 +60,9 @@ int main(int _argc, char *_argv[])
redirectStdoutToFile();
#endif
+#ifndef __HAIKU__
installSigHandler();
+#endif
char **argv;
int argc;
@@ -82,9 +84,9 @@ int main(int _argc, char *_argv[])
#ifdef _WIN32
freeUtf8CommandLine(argc, argv);
#endif
-
+#ifndef __HAIKU__
uninstallSigHandler();
-
+#endif
return exitVal;
}
/**
diff --git a/avidemux/qt4/ADM_jobs/src/ADM_jobs.cpp b/avidemux/qt4/ADM_jobs/src/ADM_jobs.cpp
index f537995..08c7f7c 100644
--- a/avidemux/qt4/ADM_jobs/src/ADM_jobs.cpp
+++ b/avidemux/qt4/ADM_jobs/src/ADM_jobs.cpp
@@ -44,9 +44,9 @@ int main(int argc, char *argv[])
#if !defined(NDEBUG) && defined(FIND_LEAKS)
new_progname = argv[0];
#endif
-
+#ifndef __HAIKU__
installSigHandler();
-
+#endif
#define STR(x) #x
#define MKSTRING(x) STR(x)
@@ -75,6 +75,8 @@ int main(int argc, char *argv[])
printf("Microsoft Windows");
#elif defined(__APPLE__)
printf("Apple");
+#elif defined(__HAIKU__)
+ printf("Haiku");
#else
printf("Linux");
#endif
@@ -124,9 +126,9 @@ int main(int argc, char *argv[])
// Init jobs
ADMJob::jobInit();
jobRun(argc,argv);
-
+#ifndef __HAIKU__
uninstallSigHandler();
-
+#endif
printf("Normal exit\n");
return 0;
}
diff --git a/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.cpp b/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.cpp
index c880574..62fa6ef 100644
--- a/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.cpp
+++ b/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.cpp
@@ -83,7 +83,7 @@ bool ADM_QPreviewCleanup(void)
* @param z
*/
#ifdef __HAIKU__
-ADM_Qvideo::ADM_Qvideo(QWidget *z) : QWidget(z) {}
+ADM_Qvideo::ADM_Qvideo(QFrame *z) : QWidget(z) {}
#else
ADM_Qvideo::ADM_Qvideo(QFrame *z) : QWidget(z)
{
@@ -215,6 +215,9 @@ void UI_getWindowInfo(void *draw, GUI_WindowInfo *xinfo)
#if defined(_WIN32)
xinfo->display=(void *)videoWindow->winId();
xinfo->systemWindowId=videoWindow->winId();
+#elif defined(__HAIKU__)
+ xinfo->display = (void*)videoWindow->winId();
+ xinfo->systemWindowId=videoWindow->winId();
#elif defined(__APPLE__)
#if defined(ADM_CPU_X86_64)
xinfo->display = (void*)videoWindow->winId();
diff --git a/avidemux/qt4/CMakeLists.txt b/avidemux/qt4/CMakeLists.txt
old mode 100755
new mode 100644
index 8881326..9e6c424
--- a/avidemux/qt4/CMakeLists.txt
+++ b/avidemux/qt4/CMakeLists.txt
@@ -28,7 +28,11 @@ ELSE(WIN32)
IF(APPLE)
include(adm_osx.cmake)
ELSE(APPLE)
- include(adm_default.cmake)
+ IF(HAIKU)
+ include(adm_haiku.cmake)
+ ELSE(HAIKU)
+ include(adm_default.cmake)
+ ENDIF(HAIKU)
ENDIF(APPLE)
ENDIF(WIN32)
#-----------------------------------
diff --git a/avidemux/qt4/adm_haiku.cmake b/avidemux/qt4/adm_haiku.cmake
new file mode 100644
index 0000000..8f25071
--- /dev/null
+++ b/avidemux/qt4/adm_haiku.cmake
@@ -0,0 +1,19 @@
+#
+#
+#
+MACRO(ADM_PREBUILD)
+ LIST(APPEND PlatformLibs "-lroot -lstdc++")
+ LIST(APPEND PlatformLibs "-lbe")
+ENDMACRO(ADM_PREBUILD)
+#
+#
+#
+MACRO(ADM_MAIN_APP)
+ ADD_EXECUTABLE(avidemux3_${QT_EXTENSION} ${ADM_EXE_SRCS})
+
+ENDMACRO(ADM_MAIN_APP)
+#
+
+MACRO(ADM_POSTBUILD)
+ ADM_INSTALL_BIN(avidemux3_${QT_EXTENSION})
+ENDMACRO(ADM_POSTBUILD)
diff --git a/avidemux_core/ADM_core/src/CMakeLists.txt b/avidemux_core/ADM_core/src/CMakeLists.txt
index 65eff7f..3786bdc 100644
--- a/avidemux_core/ADM_core/src/CMakeLists.txt
+++ b/avidemux_core/ADM_core/src/CMakeLists.txt
@@ -47,6 +47,8 @@ IF (WIN32)
target_link_libraries(ADM_core6 imagehlp ws2_32)
ELSEIF (APPLE)
target_link_libraries(ADM_core6 "-framework Carbon")
+elseif (HAIKU)
+ target_link_libraries(ADM_core6)
elseif (UNIX)
target_link_libraries(ADM_core6 dl m)
ENDIF (WIN32)
diff --git a/avidemux_core/ADM_coreSocket/src/CMakeLists.txt b/avidemux_core/ADM_coreSocket/src/CMakeLists.txt
index 82cc397..d3b4a72 100644
--- a/avidemux_core/ADM_coreSocket/src/CMakeLists.txt
+++ b/avidemux_core/ADM_coreSocket/src/CMakeLists.txt
@@ -13,4 +13,8 @@ if (WIN32)
target_link_libraries(ADM_coreSocket6 wsock32)
endif (WIN32)
+if (HAIKU)
+ target_link_libraries(ADM_coreSocket6 network)
+endif (HAIKU)
+
ADM_INSTALL_LIB(ADM_coreSocket6)
diff --git a/avidemux_core/ADM_coreSqlLight3/src/CMakeLists.txt b/avidemux_core/ADM_coreSqlLight3/src/CMakeLists.txt
index 8eb97c0..131bbc8 100644
--- a/avidemux_core/ADM_coreSqlLight3/src/CMakeLists.txt
+++ b/avidemux_core/ADM_coreSqlLight3/src/CMakeLists.txt
@@ -12,7 +12,11 @@ IF (APPLE)
TARGET_LINK_LIBRARIES(ADM_coreSqlLight3 -Wl,-read_only_relocs,suppress)
ENDIF (APPLE)
-IF (UNIX)
+IF (HAIKU)
+ TARGET_LINK_LIBRARIES(ADM_coreSqlLight3)
+ENDIF (UNIX)
+
+IF (UNIX AND NOT HAIKU)
TARGET_LINK_LIBRARIES(ADM_coreSqlLight3 dl)
ENDIF (UNIX)
diff --git a/avidemux_core/CMakeLists.txt b/avidemux_core/CMakeLists.txt
index b00ea2d..1fea9d6 100644
--- a/avidemux_core/CMakeLists.txt
+++ b/avidemux_core/CMakeLists.txt
@@ -52,9 +52,9 @@ checkFtello()
MESSAGE(STATUS "Checking for sqlite")
MESSAGE(STATUS "*******************")
-IF (UNIX AND NOT HAIKU)
- SET(SQLITE_REQUIRED_FLAGS "-ldl")
-ENDIF (UNIX)
+#IF (UNIX AND NOT HAIKU)
+# SET(SQLITE_REQUIRED_FLAGS "-ldl")
+#ENDIF (UNIX)
FIND_HEADER_AND_LIB(SQLITE sqlite3.h sqlite3 sqlite3_close ${SQLITE_REQUIRED_FLAGS})
PRINT_LIBRARY_INFO("SQLite" SQLITE_FOUND "${SQLITE_INCLUDE_DIR}" "${SQLITE_LIBRARY_DIR}" FATAL_ERROR)
--
2.16.4
From 4a36c099d15741b6fe33d68f516ac0fe955500ab Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Thu, 12 Jul 2018 00:31:10 +1000
Subject: Fix build plugins
diff --git a/avidemux_plugins/ADM_demuxers/AvsProxy/CMakeLists.txt b/avidemux_plugins/ADM_demuxers/AvsProxy/CMakeLists.txt
index 91aab7d..8235f0e 100644
--- a/avidemux_plugins/ADM_demuxers/AvsProxy/CMakeLists.txt
+++ b/avidemux_plugins/ADM_demuxers/AvsProxy/CMakeLists.txt
@@ -9,6 +9,9 @@ ADD_DEMUXER(ADM_dm_avsproxy ${ADM_avsproxy_SRCS})
if(WIN32)
target_link_libraries(ADM_dm_avsproxy wsock32)
endif(WIN32)
+if(HAIKU)
+ target_link_libraries(ADM_dm_avsproxy network)
+endif(HAIKU)
INIT_DEMUXER(ADM_dm_avsproxy)
INSTALL_DEMUXER(ADM_dm_avsproxy)
--
2.16.4
From 080395773ecb45e2ae546042e6b64db75229868d Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Thu, 12 Jul 2018 12:02:26 +1000
Subject: Disable OpenGL
diff --git a/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.cpp b/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.cpp
index 62fa6ef..c5dbd26 100644
--- a/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.cpp
+++ b/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.cpp
@@ -82,9 +82,6 @@ bool ADM_QPreviewCleanup(void)
*
* @param z
*/
-#ifdef __HAIKU__
-ADM_Qvideo::ADM_Qvideo(QFrame *z) : QWidget(z) {}
-#else
ADM_Qvideo::ADM_Qvideo(QFrame *z) : QWidget(z)
{
useExternalRedraw(true);
@@ -104,8 +101,6 @@ ADM_Qvideo::ADM_Qvideo(QFrame *z) : QWidget(z)
hostFrame=z;
} //{setAutoFillBackground(false);}
-#endif // Haiku
-
ADM_Qvideo::~ADM_Qvideo()
{
@@ -216,8 +211,8 @@ void UI_getWindowInfo(void *draw, GUI_WindowInfo *xinfo)
xinfo->display=(void *)videoWindow->winId();
xinfo->systemWindowId=videoWindow->winId();
#elif defined(__HAIKU__)
- xinfo->display = (void*)videoWindow->winId();
- xinfo->systemWindowId=videoWindow->winId();
+ xinfo->display = NULL;
+ xinfo->systemWindowId = 0;
#elif defined(__APPLE__)
#if defined(ADM_CPU_X86_64)
xinfo->display = (void*)videoWindow->winId();
--
2.16.4
From e696c749b902a056aca808dfdbe41e6a786e8f17 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Thu, 12 Jul 2018 14:44:47 +1000
Subject: Fix detect x264
diff --git a/cmake/admCheckX265.cmake b/cmake/admCheckX265.cmake
index 2e3f4d9..f9a91e5 100644
--- a/cmake/admCheckX265.cmake
+++ b/cmake/admCheckX265.cmake
@@ -19,7 +19,7 @@ MACRO(checkX265)
MESSAGE("WARNING: x265 core version is too old. At least version 9 is required.")
SET(X265_FOUND 0)
ELSE (x265_version LESS 9)
- IF(NOT WIN32)
+ IF(NOT WIN32 AND NOT HAIKU)
SET(DL dl)
ELSE(NOT WIN32)
IF(NOT MSVC)
--
2.16.4
From 688a4d827a121bb46392c5035a45c5e912baf897 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Thu, 12 Jul 2018 21:36:53 +1000
Subject: Add MediaKit audio driver
diff --git a/avidemux_plugins/ADM_audioDevices/CMakeLists.txt b/avidemux_plugins/ADM_audioDevices/CMakeLists.txt
index 0d7136b..f655b75 100644
--- a/avidemux_plugins/ADM_audioDevices/CMakeLists.txt
+++ b/avidemux_plugins/ADM_audioDevices/CMakeLists.txt
@@ -35,3 +35,7 @@ endif(APPLE)
if(WIN32)
ADD_SUBDIRECTORY(Win32)
endif(WIN32)
+
+if(HAIKU)
+ADD_SUBDIRECTORY(Haiku)
+endif(HAIKU)
diff --git a/avidemux_plugins/ADM_audioDevices/Haiku/ADM_deviceHaiku.cpp b/avidemux_plugins/ADM_audioDevices/Haiku/ADM_deviceHaiku.cpp
new file mode 100644
index 0000000..aadca18
--- /dev/null
+++ b/avidemux_plugins/ADM_audioDevices/Haiku/ADM_deviceHaiku.cpp
@@ -0,0 +1,76 @@
+#include <stdint.h>
+
+#include "ADM_default.h"
+
+#include "ADM_audiodevice.h"
+#include "ADM_audioDeviceInternal.h"
+
+#include "ADM_deviceHaiku.h"
+
+ADM_DECLARE_AUDIODEVICE(Haiku,haikuAudioDevice,1,0,0,"Haiku MediaKit audio device (c) 3dEyes");
+
+haikuAudioDevice::haikuAudioDevice()
+{
+ active=false;
+}
+
+bool
+haikuAudioDevice::localStop(void)
+{
+ active=false;
+ player.stop();
+ return true;
+}
+
+bool
+haikuAudioDevice::localInit(void)
+{
+ player.channels = (float)_channels;
+ player.sample_rate = (float)_frequency;
+ player.stop();
+ active = player.start();
+ return active;
+}
+
+void
+haikuAudioDevice::sendData(void)
+{
+ mutex.lock();
+ uint32_t avail=wrIndex-rdIndex;
+ if(avail>sizeOf10ms) avail=sizeOf10ms;
+ mutex.unlock();
+ player.write((unsigned char*)audioBuffer.at(rdIndex), avail);
+ mutex.lock();
+ rdIndex+=avail;
+ mutex.unlock();
+ return ;
+}
+
+uint8_t
+haikuAudioDevice::setVolume(int volume)
+{
+ player.setVolume(volume);
+ return 1;
+}
+
+const CHANNEL_TYPE mono[MAX_CHANNELS]={ADM_CH_MONO};
+const CHANNEL_TYPE stereo[MAX_CHANNELS]={ADM_CH_FRONT_LEFT,ADM_CH_FRONT_RIGHT};
+const CHANNEL_TYPE fiveDotOne[MAX_CHANNELS]={ADM_CH_FRONT_LEFT,ADM_CH_FRONT_RIGHT,ADM_CH_FRONT_CENTER,
+ ADM_CH_REAR_LEFT,ADM_CH_REAR_RIGHT,ADM_CH_LFE};
+
+const CHANNEL_TYPE *haikuAudioDevice::getWantedChannelMapping(uint32_t channels)
+{
+ switch(channels){
+ case 1:
+ return mono;
+ break;
+ case 2:
+ return stereo;
+ break;
+ default:
+ return fiveDotOne;
+ break;
+ }
+ return NULL;
+}
+
diff --git a/avidemux_plugins/ADM_audioDevices/Haiku/ADM_deviceHaiku.h b/avidemux_plugins/ADM_audioDevices/Haiku/ADM_deviceHaiku.h
new file mode 100644
index 0000000..ce4cb64
--- /dev/null
+++ b/avidemux_plugins/ADM_audioDevices/Haiku/ADM_deviceHaiku.h
@@ -0,0 +1,23 @@
+#ifndef ADM_deviceHaiku_H
+#define ADM_deviceHaiku_H
+
+#include "SndPlayer.h"
+
+class haikuAudioDevice : public audioDeviceThreaded
+{
+ protected :
+ bool active;
+
+ SndPlayer player;
+
+ virtual bool localInit(void);
+ virtual bool localStop(void);
+ virtual void sendData(void);
+ uint8_t setVolume(int volume);
+ virtual const CHANNEL_TYPE *getWantedChannelMapping(uint32_t channels);
+ public:
+ haikuAudioDevice();
+};
+
+#endif
+
diff --git a/avidemux_plugins/ADM_audioDevices/Haiku/CMakeLists.txt b/avidemux_plugins/ADM_audioDevices/Haiku/CMakeLists.txt
new file mode 100644
index 0000000..26411b3
--- /dev/null
+++ b/avidemux_plugins/ADM_audioDevices/Haiku/CMakeLists.txt
@@ -0,0 +1,11 @@
+INCLUDE(av_plugin)
+
+
+SET(ADM_av_haiku_SRCS ADM_deviceHaiku.cpp RingBuffer.cpp SndPlayer.cpp)
+
+ADD_AUDIO_DEVICE(ADM_av_haiku ${ADM_av_haiku_SRCS})
+TARGET_LINK_LIBRARIES(ADM_av_haiku ADM_core6 ADM_coreAudio6 ADM_coreAudioDevice6 media be)
+SDLify(ADM_deviceHaiku.cpp)
+
+INIT_AUDIO_DEVICE(ADM_av_haiku)
+INSTALL_AUDIO_DEVICE(ADM_av_haiku)
diff --git a/avidemux_plugins/ADM_audioDevices/Haiku/RingBuffer.cpp b/avidemux_plugins/ADM_audioDevices/Haiku/RingBuffer.cpp
new file mode 100644
index 0000000..5ffb95a
--- /dev/null
+++ b/avidemux_plugins/ADM_audioDevices/Haiku/RingBuffer.cpp
@@ -0,0 +1,129 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "RingBuffer.h"
+
+RingBuffer::RingBuffer( int size )
+{
+ initialized = false;
+ Buffer = new unsigned char[size];
+ if(Buffer!=NULL) {
+ memset( Buffer, 0, size );
+ BufferSize = size;
+ } else {
+ BufferSize = 0;
+ }
+ reader = 0;
+ writer = 0;
+ writeBytesAvailable = size;
+ if((locker=create_sem(1,"locker")) >= B_OK) {
+ initialized = true;
+ } else {
+ if(Buffer!=NULL) {
+ delete[] Buffer;
+ }
+ }
+}
+
+RingBuffer::~RingBuffer( )
+{
+ if(initialized) {
+ delete[] Buffer;
+ delete_sem(locker);
+ }
+}
+
+bool
+RingBuffer::Empty( void )
+{
+ memset( Buffer, 0, BufferSize );
+ reader = 0;
+ writer = 0;
+ writeBytesAvailable = BufferSize;
+ return true;
+}
+
+int
+RingBuffer::Read( unsigned char *data, int size )
+{
+ acquire_sem(locker);
+
+ if( data == 0 || size <= 0 || writeBytesAvailable == BufferSize ) {
+ release_sem(locker);
+ return 0;
+ }
+
+ int readBytesAvailable = BufferSize - writeBytesAvailable;
+
+ if( size > readBytesAvailable ) {
+ size = readBytesAvailable;
+ }
+
+ if(size > BufferSize - reader) {
+ int len = BufferSize - reader;
+ memcpy(data, Buffer + reader, len);
+ memcpy(data + len, Buffer, size-len);
+ } else {
+ memcpy(data, Buffer + reader, size);
+ }
+
+ reader = (reader + size) % BufferSize;
+ writeBytesAvailable += size;
+
+ release_sem(locker);
+ return size;
+}
+
+int
+RingBuffer::Write( unsigned char *data, int size )
+{
+ acquire_sem(locker);
+
+ if( data == 0 || size <= 0 || writeBytesAvailable == 0 ) {
+ release_sem(locker);
+ return 0;
+ }
+
+ if( size > writeBytesAvailable ) {
+ size = writeBytesAvailable;
+ }
+
+ if(size > BufferSize - writer) {
+ int len = BufferSize - writer;
+ memcpy(Buffer + writer, data, len);
+ memcpy(Buffer, data+len, size-len);
+ } else {
+ memcpy(Buffer + writer, data, size);
+ }
+
+ writer = (writer + size) % BufferSize;
+ writeBytesAvailable -= size;
+
+ release_sem(locker);
+ return size;
+}
+
+int
+RingBuffer::GetSize( void )
+{
+ return BufferSize;
+}
+
+int
+RingBuffer::GetWriteAvailable( void )
+{
+ return writeBytesAvailable;
+}
+
+int
+RingBuffer::GetReadAvailable( void )
+{
+ return BufferSize - writeBytesAvailable;
+}
+
+status_t
+RingBuffer::InitCheck( void )
+{
+ return initialized?B_OK:B_ERROR;
+}
diff --git a/avidemux_plugins/ADM_audioDevices/Haiku/RingBuffer.h b/avidemux_plugins/ADM_audioDevices/Haiku/RingBuffer.h
new file mode 100644
index 0000000..4715632
--- /dev/null
+++ b/avidemux_plugins/ADM_audioDevices/Haiku/RingBuffer.h
@@ -0,0 +1,31 @@
+#ifndef __RING_BUFFER_H__
+#define __RING_BUFFER_H__
+
+#include <OS.h>
+
+class RingBuffer {
+
+public:
+ RingBuffer(int size);
+ ~RingBuffer();
+ int Read( unsigned char* dataPtr, int numBytes );
+ int Write( unsigned char *dataPtr, int numBytes );
+
+ bool Empty( void );
+ int GetSize( );
+ int GetWriteAvailable( );
+ int GetReadAvailable( );
+ status_t InitCheck( );
+private:
+ unsigned char *Buffer;
+ int BufferSize;
+ int reader;
+ int writer;
+ int writeBytesAvailable;
+
+ sem_id locker;
+
+ bool initialized;
+};
+
+#endif
diff --git a/avidemux_plugins/ADM_audioDevices/Haiku/SndPlayer.cpp b/avidemux_plugins/ADM_audioDevices/Haiku/SndPlayer.cpp
new file mode 100644
index 0000000..6d9370e
--- /dev/null
+++ b/avidemux_plugins/ADM_audioDevices/Haiku/SndPlayer.cpp
@@ -0,0 +1,111 @@
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <SoundPlayer.h>
+
+#include "SndPlayer.h"
+
+static void proc(void *cookie, void *buffer, size_t len, const media_raw_audio_format &format)
+{
+ RingBuffer *ring = (RingBuffer*)cookie;
+ unsigned char* ptr = (unsigned char*)buffer;
+
+ size_t readed = ring->Read(ptr,len);
+
+ if(readed < len)
+ memset(ptr+readed, 0, len - readed);
+}
+
+SndPlayer::SndPlayer()
+{
+ channels = sample_rate = delay = 0;
+ player = NULL;
+ _isOK = true;
+}
+
+bool SndPlayer::start()
+{
+ size_t gSoundBufferSize = 8192 * sizeof(short);
+
+ media_raw_audio_format form = {
+ sample_rate,
+ channels,
+ media_raw_audio_format::B_AUDIO_SHORT,
+ B_MEDIA_LITTLE_ENDIAN,
+ gSoundBufferSize
+ };
+
+ ring = new RingBuffer(gSoundBufferSize * 3);
+ if(ring->InitCheck() != B_OK) {
+ delete ring; ring = 0;
+ return false;
+ }
+
+ player = new BSoundPlayer(&form, "Avidemux", proc, NULL, (void*)ring);
+
+ if(player->InitCheck() != B_OK) {
+ delete player;
+ player = NULL;
+ return false;
+ }
+
+ player->Start();
+ player->SetHasData(true);
+
+ _isOK = true;
+
+ return player != NULL;
+}
+void SndPlayer::stop()
+{
+ if ( player )
+ {
+ if(player) {
+ player->Stop();
+ delete player;
+ delete ring;
+ }
+
+ player = NULL;
+ ring = NULL;
+ }
+}
+
+void SndPlayer::flush()
+{
+ ring->Empty();
+}
+
+void SndPlayer::setVolume(int volume)
+{
+ if (player!=NULL) {
+ player->SetVolume(volume / 100.0);
+ }
+}
+
+double SndPlayer::getLatency()
+{
+ double lat = player->Latency() / (ring->GetSize()*4.0);
+
+ return lat;
+}
+
+bool SndPlayer::write( unsigned char *src_ptr, size_t size)
+{
+ while ( size > 0 && size % 4 )
+ size--;
+ if ( size <= 0 )
+ return false;
+
+ size_t len = size;
+
+ for(;;) {
+ size_t len2 = ring->Write(src_ptr, len);
+ if (len2 == len)break;
+ len -= len2;
+ src_ptr += len2;
+ snooze(100);
+ }
+
+ return true;
+}
diff --git a/avidemux_plugins/ADM_audioDevices/Haiku/SndPlayer.h b/avidemux_plugins/ADM_audioDevices/Haiku/SndPlayer.h
new file mode 100644
index 0000000..6a6efde
--- /dev/null
+++ b/avidemux_plugins/ADM_audioDevices/Haiku/SndPlayer.h
@@ -0,0 +1,36 @@
+#ifndef SNDPLAY_H
+#define SNDPLAY_H
+
+#include <SoundPlayer.h>
+
+#include "RingBuffer.h"
+
+class SndPlayer
+{
+public:
+ SndPlayer();
+ inline ~SndPlayer() { stop();}
+ inline bool isOK() const {return _isOK;}
+ inline bool isOpen() const {return player!=NULL;}
+
+ bool start();
+ void stop();
+
+ double getLatency();
+
+ bool write( unsigned char *src_ptr, size_t size);
+
+ void flush();
+ void setVolume(int volume);
+
+ double delay;
+ uchar channels;
+ float sample_rate;
+
+private:
+ bool _isOK;
+ BSoundPlayer *player;
+ RingBuffer *ring;
+};
+
+#endif
--
2.16.4
From 61a661adc6567d47bf4f0839755718622429164e Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Thu, 12 Jul 2018 21:37:17 +1000
Subject: Fix path for settings dir
diff --git a/avidemux_core/ADM_core/src/ADM_folder_linux.cpp b/avidemux_core/ADM_core/src/ADM_folder_linux.cpp
index 3625d55..ee6838a 100644
--- a/avidemux_core/ADM_core/src/ADM_folder_linux.cpp
+++ b/avidemux_core/ADM_core/src/ADM_folder_linux.cpp
@@ -146,9 +146,11 @@ void ADM_initBaseDir(int argc, char *argv[])
}
strcpy(ADM_basedir, homeEnv);
AddSeparator(ADM_basedir);
-
+#ifdef __HAIKU__
+ const char *ADM_DIR_NAME = "config/settings/avidemux6";
+#else
const char *ADM_DIR_NAME = ".avidemux6";
-
+#endif
strcat(ADM_basedir, ADM_DIR_NAME);
strcat(ADM_basedir, ADM_SEPARATOR);
--
2.16.4