Tweak opus build flags and allocs

This gets us to ~40% of one core cpu usage during playback. Good enough
for a while I reckon!

Paid for the internal ram usage by reclaiming some stack size headroom.
custom
jacqueline 1 year ago
parent f772ab9f20
commit 4bc77f901b
  1. 6
      lib/opusfile/CMakeLists.txt
  2. 8
      lib/opusfile/include/custom_support.h
  3. 2
      src/dev_console/include/console.hpp
  4. 12
      src/tasks/tasks.cpp

@ -11,6 +11,11 @@ set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
set(OPUS_FIXED_POINT ON) set(OPUS_FIXED_POINT ON)
set(OPUS_ENABLE_FLOAT_API OFF) set(OPUS_ENABLE_FLOAT_API OFF)
set(OPUS_VAR_ARRAYS OFF)
set(OPUS_USE_ALLOCA ON)
set(OPUS_NONTHREADSAFE_PSEUDOSTACK OFF)
set(OPUS_INSTALL_PKG_CONFIG_MODULE OFF) set(OPUS_INSTALL_PKG_CONFIG_MODULE OFF)
set(OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF) set(OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF)
set(OPUS_BUILD_TESTING OFF) set(OPUS_BUILD_TESTING OFF)
@ -18,5 +23,6 @@ set(OPUS_BUILD_SHARED_LIBS OFF)
add_subdirectory($ENV{PROJ_PATH}/lib/opus ${CMAKE_CURRENT_BINARY_DIR}/opus) add_subdirectory($ENV{PROJ_PATH}/lib/opus ${CMAKE_CURRENT_BINARY_DIR}/opus)
target_compile_definitions(opus PRIVATE CUSTOM_SUPPORT) target_compile_definitions(opus PRIVATE CUSTOM_SUPPORT)
target_compile_options(opus PRIVATE -Os -DSMALL_FOOTPRINT -funroll-loops -ffast-math)
target_include_directories(opus PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) target_include_directories(opus PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(${COMPONENT_LIB} PUBLIC opus) target_link_libraries(${COMPONENT_LIB} PUBLIC opus)

@ -6,12 +6,10 @@
#define OVERRIDE_OPUS_ALLOC #define OVERRIDE_OPUS_ALLOC
#define OVERRIDE_OPUS_FREE #define OVERRIDE_OPUS_FREE
static OPUS_INLINE void *opus_alloc (size_t size) static OPUS_INLINE void* opus_alloc(size_t size) {
{ return heap_caps_malloc(size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
return heap_caps_malloc(size, MALLOC_CAP_SPIRAM);
} }
static OPUS_INLINE void opus_free (void *ptr) static OPUS_INLINE void opus_free(void* ptr) {
{
heap_caps_free(ptr); heap_caps_free(ptr);
} }

@ -18,7 +18,7 @@ class Console {
auto Launch() -> void; auto Launch() -> void;
protected: protected:
virtual auto GetStackSizeKiB() -> uint16_t { return 16; } virtual auto GetStackSizeKiB() -> uint16_t { return 8; }
virtual auto RegisterExtraComponents() -> void {} virtual auto RegisterExtraComponents() -> void {}
private: private:

@ -39,22 +39,20 @@ auto AllocateStack() -> cpp::span<StackType_t>;
// usually written with embedded use cases in mind. // usually written with embedded use cases in mind.
template <> template <>
auto AllocateStack<Type::kAudioDecoder>() -> cpp::span<StackType_t> { auto AllocateStack<Type::kAudioDecoder>() -> cpp::span<StackType_t> {
constexpr std::size_t size = 24 * 1024; constexpr std::size_t size = 20 * 1024;
static StackType_t sStack[size]; static StackType_t sStack[size];
return {sStack, size}; return {sStack, size};
} }
// LVGL requires only a relatively small stack. However, it can be allocated in // LVGL requires only a relatively small stack. Lua's stack is allocated
// PSRAM so we give it a bit of headroom for safety. // separately.
template <> template <>
auto AllocateStack<Type::kUi>() -> cpp::span<StackType_t> { auto AllocateStack<Type::kUi>() -> cpp::span<StackType_t> {
constexpr std::size_t size = 16 * 1024; constexpr std::size_t size = 14 * 1024;
static StackType_t sStack[size]; static StackType_t sStack[size];
return {sStack, size}; return {sStack, size};
} }
template <> template <>
// PCM conversion and resampling uses a very small amount of stack. It works // PCM conversion and resampling uses a very small amount of stack.
// entirely with PSRAM-allocated buffers, so no real speed gain from allocating
// it internally.
auto AllocateStack<Type::kAudioConverter>() -> cpp::span<StackType_t> { auto AllocateStack<Type::kAudioConverter>() -> cpp::span<StackType_t> {
constexpr std::size_t size = 4 * 1024; constexpr std::size_t size = 4 * 1024;
static StackType_t sStack[size]; static StackType_t sStack[size];

Loading…
Cancel
Save