작업 목표
여러 트랙을 한 트랙으로 압축하는 렌더러를 구성하고, 소리를 내보낼 수 있도록 구성한다.
단일 트랙의 렌더러
먼저 사용자가 생성한 트랙이나 시스템에서 생성된 VTrack에 대하여 AudioPackage로 추출하거나 렌더링할 수 있다. 이는 트랙에 생성된 오디오 스트림을 모두 합쳐 하나의 AudioPackage로 꺼내는 작업이며, 소리 파일을 내보내거나 소리를 재생할 때 필요한 스트림의 역할을 한다.
단일 트랙의 렌더러
문제점이 하나 존재 하는데, 단일 트랙의 렌더러는 하나의 트랙만 전체 소리 스트림으로 내보내기 때문에 다수의 트랙이 있는 경우 각 트랙을 하나씩 처리한 뒤 최종 스트림을 모두 합쳐야 한다.
여러 트랙을 하나의 트랙으로
하지만 위 구현에 따르면, 스트림이 만들어진 이후에야 트랙을 서로 합칠 수 있게 되므로, 오디오가 없는 부분에서는 성능 낭비가 발생할 수 있다.
트랙 내 오디오 처리
상기 그림 처럼, 약 2분 가량의 프로젝트에 중간에만 Object가 존재한다고 가정하자. 이 때 좌우로는 아예 오브젝트가 존재하지 않기 때문에 소리 샘플은 없는 상태이다. 하지만 위 렌더러를 통해 하나의 트랙을 처리하고 나면, Object는 사라지고 긴 소리 데이터로 바뀌게 된다. Object가 존재하는 부분은 오디오 샘플이 존재하겠지만, Object가 존재하지 않는 부분은 0인 오디오 데이터로 존재하게 된다. 즉 Object가 존재하지 않는 위치에까지 소리 샘플 0으로 자리를 채우고 있게 되는 셈이다. 이런 경우, 빨간 박스까지 작업을 처리해야하는 문제가 발생하며, 약 40초의 0 샘플을 덧셈 연산해야 하는 시간 낭비가 발생할 수 있다.
만약 sample rate 44100hz, 2channel 인 경우, 44100 * 40 * 2 번의 CPU 연산 작업을 헛으로 사용하게 된다. 따라서, 무작정 VTrack들을 단일 Stream으로 변환하기 보다, 겹쳐있는 스트림들을 다시 VObject로 묶어서 최종적으로 VTrack 하나로 만든 뒤, 이 VTrack 하나를 렌더링하는 방법을 사용하기로 결정하였다.
VTrack Compressor
즉, 대량의 VTrack이 존재할 때, 해당 VTrack 내에 있는 Object들을 먼저 조사한 뒤, 겹쳐 있는 VObject들의 스트림 연산을 먼저 진행하고, 하나의 트랙에 존재하는 것 처럼 만든 뒤 새로 만들어진 트랙을 반환해준다.
VTrack Compressor
이렇게 반환된 VTrack을 비로소 VTrack Renderer에 요청함으로써 불필요한 작업을 최소한으로 줄일 수 있다. 아래 사진은 vObject간의 소리 샘플을 합치는 부분을 나타낸 것이다. 성능 문제점이 하나 존재 하는데, 이 역시도 zero sample인 부분을 더하게 된다는 것이다.
VObject Mixer 클래스
두 VObject의 덧셈 연산
다음 목표
소리 재생 처리자를 구성하고 UI를 구성한다. UI를 구성하고 PD-Layer을 테스트 해 본다.