Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
2af4ab7
Revert "Temporarily disable and remove AUv3 and ARA IPC drafts for up…
sgretscher Nov 6, 2025
48063cb
Bump version number to 3.0.0 for future development
sgretscher Nov 6, 2025
d75c176
Bump copyright year to 2026
sgretscher Feb 17, 2026
f39bc50
Add API generation 3.0 Draft, starting ARA 3 development
sgretscher Feb 17, 2026
eceb61a
Drop obsolete ARA 1 support, including deprecated ARAPlugInExtensionI…
sgretscher Apr 30, 2026
6bb8e8d
Drop obsolete ARA 2.0 Draft support, including monolithic ARA 1 style…
sgretscher Apr 30, 2026
5d7d28a
ARA_Library and ARA_Examples now consistently require C++14 on all pl…
sgretscher Apr 30, 2026
8477f83
C++17 is now consistently required on all platforms
sgretscher Apr 30, 2026
2e7e0de
Remove ARA_STRUCT_MEMBER macro, it's obsolete in C++17 and later
sgretscher Apr 30, 2026
b18234d
Improve C++ template usage based on C++17 now being required
sgretscher Apr 30, 2026
9758981
Add prototypes or static declaration to all internal functions, allow…
sgretscher Apr 30, 2026
2c1b5e6
Using C++17 allows to limit ARA_MAYBE_UNUSED_VAR/ARG to C code
sgretscher Apr 30, 2026
5ddec54
Remove unused function left over from older version of IPC encoding
sgretscher Apr 30, 2026
441d582
Fix some warnings in IPC code
sgretscher Apr 30, 2026
3448b84
IPC main thread dispatcher does not need to dispatch to main thread i…
sgretscher Apr 30, 2026
1424a6c
Improve IPC debug output
sgretscher Apr 30, 2026
3b24594
Unify IPC method ID generation for host and plug-in methods
sgretscher Apr 30, 2026
c4875e3
More consistent formatting/code structure
sgretscher Apr 30, 2026
0e71581
Move IPC dispatcher subclass-specific message argument keys into resp…
sgretscher Apr 30, 2026
a13ff63
Improve IPC documentation
sgretscher Apr 30, 2026
730b949
IPC MessageHandler changed from delegate interface to std::function<>
sgretscher Apr 30, 2026
1e41828
External IPC interface uses ARAIPCProxyPlugIn/HostRef instead of ARAI…
sgretscher Apr 30, 2026
5d9fd64
IPCProxyPlugIn/Host take ownership of its associated IPCConnection
sgretscher Apr 30, 2026
1c2146a
Simplify IPC debug logging
sgretscher Apr 30, 2026
a848766
Make MessageHandler a creation parameter of IPC Connection
sgretscher Apr 30, 2026
75607b9
Fix double delete of IPC Channel in AUv3 case
sgretscher Apr 30, 2026
f837b9a
IPC code uses std::unique_ptr<> to express ownership
sgretscher Apr 30, 2026
438877f
IPC Connection encapsulates WaitForMessageDelegate as std::function<>
sgretscher Apr 30, 2026
7a47da5
Instead of subclassing, provide IPC Connection delegate data as const…
sgretscher Apr 30, 2026
02e5af9
IPC ReplyHandler encapsulated into std::function<>
sgretscher Apr 30, 2026
181f67e
Made IPC MessageDispatcher and its subclasses private details of Conn…
sgretscher Apr 30, 2026
36a69d6
AudioUnit implementation of AUMessageChannel moved from example code …
sgretscher Apr 30, 2026
9590a17
Suppress unnecessary main thread wakeups when waiting for IPC messages
sgretscher Apr 30, 2026
c273cbc
waitForMessage...() must be implemented by IPC MEssageChannel instead…
sgretscher Apr 30, 2026
1508801
Move semaphore from MainThreadMessageDispatcher to dedicated helper c…
sgretscher Apr 30, 2026
3466e0e
Consistent spelling of timestrech
sgretscher Apr 30, 2026
cbc43d5
Initial draft of region sequence persistency
sgretscher Apr 30, 2026
661c46a
Add notifyRegionSequenceDataChanged() to complement region sequence p…
sgretscher May 1, 2026
f60f3f0
Add isPlaybackRegionPreservingAudioSourceSignal(), superseding isAudi…
sgretscher May 1, 2026
a4ab827
Initial draft of lyrics-related content, tailored to support singing …
sgretscher May 1, 2026
5fc1e83
Initial draft of ARA generator plug-ins that operate merely based on …
sgretscher May 1, 2026
057987b
feat(IPC): Add Linux IPC support (with Wine compatibility)
samuel-asleep Jun 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 17 additions & 11 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# ======================
# ARA Library CMake Integration
#
# Copyright (c) 2020-2025, Celemony Software GmbH, All Rights Reserved.
# Copyright (c) 2020-2026, Celemony Software GmbH, All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -41,6 +41,14 @@ project(ARA_Library
LANGUAGES C CXX
)

# language standards

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# ======================

add_subdirectory("${ARA_API_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/ARA_API.build" EXCLUDE_FROM_ALL)
Expand All @@ -55,13 +63,6 @@ function(configure_ARA_Library_target target)
# file grouping
ara_group_target_files(${target})

# language standards
target_compile_features(${target}
PUBLIC
cxx_std_11
c_std_11
)

# ARA_API dependency
target_link_libraries(${target} PUBLIC ARA_API)

Expand All @@ -85,6 +86,14 @@ function(configure_ARA_Library_target target)
PRIVATE
-DNOMINMAX=1
)
# /Zc:__cplusplus, added in Visual Studio 2017 version 15.7, is required to make __cplusplus
# accurate, see https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
if(MSVC AND (MSVC_VERSION GREATER_EQUAL 1914))
target_compile_options(${target}
PRIVATE
"/Zc:__cplusplus"
)
endif()
elseif(APPLE)
if(XCODE)
set_target_properties(${target} PROPERTIES
Expand Down Expand Up @@ -167,8 +176,6 @@ configure_ARA_Library_target(ARA_PlugIn_Library)

# ======================

if(FALSE)

add_library(ARA_IPC_Library ${ARA_LIBRARY_TARGET_TYPE}
"${CMAKE_CURRENT_SOURCE_DIR}/IPC/ARAIPC.h"
"${CMAKE_CURRENT_SOURCE_DIR}/IPC/ARAIPCEncoding.h"
Expand Down Expand Up @@ -199,4 +206,3 @@ target_link_libraries(ARA_IPC_Library PRIVATE
)

configure_ARA_Library_target(ARA_IPC_Library)
endif()
18 changes: 15 additions & 3 deletions ChangeLog.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
Proposed Features which have been postponed to a later subrelease:
- generic ARA IPC library, providing a proxy host and a proxy plug-in,
based on the IPC Example from earlier SDK releases
This is a development build of the ARA Library 3.0.
=== PRELIMINARY - DO NOT USE FOR SHIPPING PRODUCTS! ===


Changes since previous releases:
- initial draft of ARA generator plug-ins that operate merely based on content descriptions (no sample input)
- initial draft of lyrics-related content types, tailored to support singing voice synthesis
- initial draft of region sequence persistency
- added isPlaybackRegionPreservingAudioSourceSignal(), superseding isAudioModificationPreservingAudioSourceSignal()
- initial draft of generic ARA IPC library providing a proxy host and a proxy plug-in,
based on heavily refactored IPC Example from earlier SDK releases
- dropped support for ARA 1 and 2.0 Draft APIs
If previously optionally supporting obsolete ARA 1 persistency, now exclusively use ARA 2 persistency.
- C++17 is now consistently required on all platforms
- fixed inconsistent spelling of "timestretch" in various identifiers


=== ARA SDK 2.3 release (aka 2.3.001) (2025/11/07) ===
Expand Down
32 changes: 22 additions & 10 deletions Debug/ARAContentLogger.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//! \file ARAContentLogger.h
//! class to conveniently log (and validate) ARA content
//! \project ARA SDK Library
//! \copyright Copyright (c) 2018-2025, Celemony Software GmbH, All Rights Reserved.
//! \copyright Copyright (c) 2018-2026, Celemony Software GmbH, All Rights Reserved.
//! \license Licensed under the Apache License, Version 2.0 (the "License");
//! you may not use this file except in compliance with the License.
//! You may obtain a copy of the License at
Expand Down Expand Up @@ -40,13 +40,8 @@ namespace ARA {

struct ContentLogger
{
#if __cplusplus >= 201703L
template <typename ControllerType, typename ModelObjectRefType>
using ContentReaderRef = decltype ((static_cast<ControllerType*> (nullptr)->*ContentReaderFunctionMapper<ControllerType, ModelObjectRefType>::createContentReader) (nullptr, kARAContentTypeNotes, nullptr));
#else
template <typename ControllerType, typename ModelObjectRefType>
using ContentReaderRef = typename std::result_of<decltype (ContentReaderFunctionMapper<ControllerType, ModelObjectRefType>::createContentReader) (ControllerType, ModelObjectRefType, ARAContentType, const ARAContentTimeRange*)>::type;
#endif

template <ARAContentType contentType, typename ControllerType, typename ModelObjectRefType>
#if ARA_VALIDATE_API_CALLS
Expand All @@ -60,12 +55,13 @@ struct ContentLogger

// array of all content types defined in the api

static inline constexpr std::array<ARAContentType, 6> getAllContentTypes () noexcept
static inline constexpr std::array<ARAContentType, 7> getAllContentTypes () noexcept
{
return { { kARAContentTypeNotes,
kARAContentTypeTempoEntries, kARAContentTypeBarSignatures,
kARAContentTypeStaticTuning,
kARAContentTypeKeySignatures, kARAContentTypeSheetChords
kARAContentTypeKeySignatures, kARAContentTypeSheetChords,
kARAContentTypeLyricEntries
} };
}

Expand Down Expand Up @@ -93,6 +89,7 @@ struct ContentLogger
case kARAContentTypeStaticTuning: return ContentTypeMapper<kARAContentTypeStaticTuning>::enumName;
case kARAContentTypeKeySignatures: return ContentTypeMapper<kARAContentTypeKeySignatures>::enumName;
case kARAContentTypeSheetChords: return ContentTypeMapper<kARAContentTypeSheetChords>::enumName;
case kARAContentTypeLyricEntries: return ContentTypeMapper<kARAContentTypeLyricEntries>::enumName;
default: ARA_INTERNAL_ASSERT (false); return "kARAContentType???";
}
}
Expand All @@ -107,6 +104,7 @@ struct ContentLogger
case kARAContentTypeStaticTuning: return ContentTypeMapper<kARAContentTypeStaticTuning>::typeName;
case kARAContentTypeKeySignatures: return ContentTypeMapper<kARAContentTypeKeySignatures>::typeName;
case kARAContentTypeSheetChords: return ContentTypeMapper<kARAContentTypeSheetChords>::typeName;
case kARAContentTypeLyricEntries: return ContentTypeMapper<kARAContentTypeLyricEntries>::typeName;
default: ARA_INTERNAL_ASSERT (false); return "ARAContent???";
}
}
Expand Down Expand Up @@ -193,14 +191,22 @@ struct ContentLogger
(logGivenName && logParsedName) ? " aka " : "", (logGivenName && logParsedName) ? parsedChordName.c_str () : "", chordData.position);
}

static inline void logEvent (ARAInt32 idx, const ARAContentLyricsEntry& lyricsEntry)
{
ARA_LOG ("%s[%i] %s%s, %i %s phonemes%s, position = %.3f", getTypeNameForContentType (kARAContentTypeLyricEntries), idx,
(lyricsEntry.continuesPreviousWord) ? "-" : "", lyricsEntry.lyrics,
lyricsEntry.phonemeCount, getNameForContentGrade (lyricsEntry.phonemesGrade),
(lyricsEntry.phonemeOffsets) ? " w/ offsets": "", lyricsEntry.position);
}

// internal helper for log ()

template <ARAContentType contentType, typename ContentReader, typename std::enable_if<contentType != kARAContentTypeTempoEntries, bool>::type = true>
template <ARAContentType contentType, typename ContentReader, std::enable_if_t<contentType != kARAContentTypeTempoEntries, bool> = true>
static inline void logEventIteration (ContentReader& reader, ARAInt32 i)
{
logEvent (i, reader[i]);
}
template <ARAContentType contentType, typename ContentReader, typename std::enable_if<contentType == kARAContentTypeTempoEntries, bool>::type = true>
template <ARAContentType contentType, typename ContentReader, std::enable_if_t<contentType == kARAContentTypeTempoEntries, bool> = true>
static inline void logEventIteration (ContentReader& reader, ARAInt32 i)
{
const auto event { reader[i] };
Expand Down Expand Up @@ -252,6 +258,7 @@ struct ContentLogger
case kARAContentTypeStaticTuning: return log<kARAContentTypeStaticTuning> (controller, modelObjectRef, range, logIfNotAvailable);
case kARAContentTypeKeySignatures: return log<kARAContentTypeKeySignatures> (controller, modelObjectRef, range, logIfNotAvailable);
case kARAContentTypeSheetChords: return log<kARAContentTypeSheetChords> (controller, modelObjectRef, range, logIfNotAvailable);
case kARAContentTypeLyricEntries: return log<kARAContentTypeLyricEntries> (controller, modelObjectRef, range, logIfNotAvailable);
default: ARA_INTERNAL_ASSERT (false); return false;
}
}
Expand Down Expand Up @@ -321,6 +328,11 @@ struct ContentLogger
log<kARAContentTypeKeySignatures> (controller, modelObjectRef, range, false);
log<kARAContentTypeSheetChords> (controller, modelObjectRef, range, false);
}
if (scopeFlags.affectLyrics ())
{
ARA_LOG ("lyrics scope updated, related content is:");
log<kARAContentTypeLyricEntries> (controller, modelObjectRef, range, false);
}
}
};

Expand Down
21 changes: 20 additions & 1 deletion Debug/ARAContentValidator.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//! \file ARAContentValidator.h
//! utility classes vor validating content readers
//! \project ARA SDK Library
//! \copyright Copyright (c) 2018-2025, Celemony Software GmbH, All Rights Reserved.
//! \copyright Copyright (c) 2018-2026, Celemony Software GmbH, All Rights Reserved.
//! \license Licensed under the Apache License, Version 2.0 (the "License");
//! you may not use this file except in compliance with the License.
//! You may obtain a copy of the License at
Expand Down Expand Up @@ -137,6 +137,25 @@ struct ContentReaderValidatorImplementation<kARAContentTypeSheetChords>
}
};

template <>
struct ContentReaderValidatorImplementation<kARAContentTypeLyricEntries>
{
static inline void validateEventCount (ARAInt32 eventCount) { ARA_VALIDATE_API_CONDITION (eventCount >= 0); }

static inline void validateEvent (const ARAContentLyricsEntry* event)
{
ARA_VALIDATE_API_CONDITION ((event->continuesPreviousWord == kARAFalse) || (event->lyrics != nullptr));
ARA_VALIDATE_API_CONDITION ((event->phonemeCount == 0) || (event->phonemes != nullptr));
ARA_VALIDATE_API_CONDITION ((event->phonemeCount != 0) || (event->phonemes == nullptr));
ARA_VALIDATE_API_CONDITION ((event->phonemeCount != 0) || (event->phonemeOffsets == nullptr));
}

static inline void validateEventSequence (const ARAContentLyricsEntry* event, const ARAContentLyricsEntry* prevEvent)
{
ARA_VALIDATE_API_CONDITION (prevEvent->position < event->position);
}
};


/*******************************************************************************/
// ContentReaderValidator
Expand Down
3 changes: 2 additions & 1 deletion Debug/ARADebug.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//! \file ARADebug.c
//! debug helpers for the ARA SDK Library
//! \project ARA SDK Library
//! \copyright Copyright (c) 2012-2025, Celemony Software GmbH, All Rights Reserved.
//! \copyright Copyright (c) 2012-2026, Celemony Software GmbH, All Rights Reserved.
//! \license Licensed under the Apache License, Version 2.0 (the "License");
//! you may not use this file except in compliance with the License.
//! You may obtain a copy of the License at
Expand Down Expand Up @@ -256,6 +256,7 @@ void ARASetExternalAssertReference(ARAAssertFunction * address)
_Pragma("GCC diagnostic push")
_Pragma("GCC diagnostic ignored \"-Wmissing-noreturn\"")
#endif
void ARAAssertionFailure(ARAAssertCategory category, const void * problematicArgument, const char * file, int line, const char * diagnosis);
void ARAAssertionFailure(ARAAssertCategory category, const void * problematicArgument, const char * file, int line, const char * diagnosis)
{
#if ARA_ENABLE_INTERNAL_ASSERTS
Expand Down
30 changes: 14 additions & 16 deletions Debug/ARADebug.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//! \file ARADebug.h
//! debug helpers for the ARA SDK Library
//! \project ARA SDK Library
//! \copyright Copyright (c) 2012-2025, Celemony Software GmbH, All Rights Reserved.
//! \copyright Copyright (c) 2012-2026, Celemony Software GmbH, All Rights Reserved.
//! \license Licensed under the Apache License, Version 2.0 (the "License");
//! you may not use this file except in compliance with the License.
//! You may obtain a copy of the License at
Expand Down Expand Up @@ -97,22 +97,20 @@ extern "C"
// prevent unused variable warnings
/*******************************************************************************/

#if defined(__cplusplus) && (__cplusplus >= 201703L)
#define ARA_MAYBE_UNUSED_VAR(var) var [[maybe_unused]]
#elif defined(__GNUC__)
#define ARA_MAYBE_UNUSED_VAR(var) var __attribute__((unused))
#elif defined(_MSC_VER)
#define ARA_MAYBE_UNUSED_VAR(var) var; (false ? (void)var : (void)false)
#else
#define ARA_MAYBE_UNUSED_VAR(var) var; (void)var
#endif
#if !defined(__cplusplus)
#if defined(__GNUC__)
#define ARA_MAYBE_UNUSED_VAR(var) var __attribute__((unused))
#elif defined(_MSC_VER)
#define ARA_MAYBE_UNUSED_VAR(var) var; (false ? (void)var : (void)false)
#else
#define ARA_MAYBE_UNUSED_VAR(var) var; (void)var
#endif

#if defined(__cplusplus) && (__cplusplus >= 201703L)
#define ARA_MAYBE_UNUSED_ARG(var) var [[maybe_unused]]
#elif defined(__GNUC__)
#define ARA_MAYBE_UNUSED_ARG(var) var __attribute__((unused))
#else
#define ARA_MAYBE_UNUSED_ARG(var) var
#if defined(__GNUC__)
#define ARA_MAYBE_UNUSED_ARG(var) var __attribute__((unused))
#else
#define ARA_MAYBE_UNUSED_ARG(var) var
#endif
#endif


Expand Down
3 changes: 2 additions & 1 deletion Dispatch/ARAContentReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//! \file ARAContentReader.h
//! content reading utility classes
//! \project ARA SDK Library
//! \copyright Copyright (c) 2018-2025, Celemony Software GmbH, All Rights Reserved.
//! \copyright Copyright (c) 2018-2026, Celemony Software GmbH, All Rights Reserved.
//! \license Licensed under the Apache License, Version 2.0 (the "License");
//! you may not use this file except in compliance with the License.
//! You may obtain a copy of the License at
Expand Down Expand Up @@ -51,6 +51,7 @@ struct ContentTypeMapper;
ARA_SPECIALIZE_CONTENT_TYPE_MAPPER (kARAContentTypeStaticTuning, ARAContentTuning)
ARA_SPECIALIZE_CONTENT_TYPE_MAPPER (kARAContentTypeKeySignatures, ARAContentKeySignature)
ARA_SPECIALIZE_CONTENT_TYPE_MAPPER (kARAContentTypeSheetChords, ARAContentChord)
ARA_SPECIALIZE_CONTENT_TYPE_MAPPER (kARAContentTypeLyricEntries, ARAContentLyricsEntry)

#undef ARA_SPECIALIZE_CONTENT_TYPE_MAPPER

Expand Down
Loading