-
프로젝트 구조 변경 - 튜너를 외부로 분리JDTuner/개발기록 2026. 4. 3. 20:19
변경 전 구조

변경 전 구조 위 이미지는 변경 전 구조이다.
UI를 제외한 나머지 레이어의 역할을 설명하면
DSP Engine Layer
주파수 검출을 위한 Yin 알고리즘을 실행시키고 Wrapper로 결과를 전달한다.
Wrapper Layer
튜너로 부터 받은 결과 값을 WrapperResult로 변경해 UI로 전달한다.
이 과정에서 cents값의 제한을 두게 하거나
smoothFrequency와 같은 데이터에 관여하는 코드가 포함되어 있다.
문제점 1 - Wrapper에서의 불필요한 코드
Wrapper는 c++에서 받은 값을 Swift로 전달하는 역할만 가지고 있어야 한다고 생각했다.
비즈니스 로직과 같은 데이터를 다루는 코드가 들어갈 경우 튜너 프로젝트와 Wrapper 둘다 수정해야하고
c++, Objective-C 간의 호환코드도 들어가 기능이 추가될수록 유지보수가 어려워 질거라고 생각이 들었다.
문제점 2 - DSP 코드의 재사용성
현재는 iOS 프로젝트만 만들고 있지만 안드로이드나 내가 만들 플러그인에도 해당 튜너 알고리즘을 사용할 경우도 생각하면
튜너 코드까지 iOS 프로젝트에 포함되어 있는 경우 각 프로젝트마다 튜너 코드도 다시 작성해야하는 문제점이 있다.
그리고 현재 프로젝트에서도 튜너쪽 기능을 추가하려고 하면 DSP Engine 쪽을 건드리게 되는데 이런 경우
순수한 튜너의 코드까지 건드리게 돼서 불리한점이 많다.
해결 방안
나만의 DSP 코드 레포지토리를 따로 분리하고 각 프로젝트에서 이 DSP 레포지토리에서
필요한 기능의 C++ 코드를 의존하는 방향으로 변경해
순수 DSP 코드를 건드리지 않으면서 각 프로젝트의 목적 및 기능에 맞게 개발하게 구조를 수정한다.
요약하면 DSP 부분만 외부로 빼내기
작업
DSP 코드만 모아놓는 레포지토리를 별도로 만들고
튜너 코드를 그 폴더에 이동 시켰으며 jucer에서 해당 코드를 참조하도록 수정했다.
앱과 튜너 프로젝트 모두 헤더 경로 설정이 필요했으며 개발환경 설정의 경험이 있어 어렵지 않았다.
변경 후 구조

변경 후 구조 프로젝트 내의 Engine Layer가 외부의 DSP 코드에 의존하게되며
이 프로젝트의 경우 외부 DSP 코드의 튜너만을 참조해 사용하게 된다.
이렇게해서 순수 DSP 코드는 특정 프로젝트에서 개발하더라도 유지가 가능해졌고
다른 프로젝트에 재사용 가능하게 됐다.
이후 작업
Wrapper 코드에 있는 데이터 관여 코드를 Engine으로 넘기고
Wrapper는 최대한 C++쪽의 결과를 앱으로 넘기는 기능만 남겨
더 세밀한 역할 분리 작업을 할 예정이다.
'JDTuner > 개발기록' 카테고리의 다른 글
완성 및 마무리 (0) 2026.05.04 튜닝 모드 변경 (1) 2026.04.23 UI 수정 (0) 2026.03.15 정확도 개선 2 - 1차 IIR 필터 (0) 2026.03.11 정확도 개선 1 - Parabolic Interpolation (0) 2026.03.11