이번 목표
목소리 녹음 소프트웨어의 PD Layer의 클래스 다이어그램을 마무리 짓고 문제점을 해결하기로 한다. 그리고 흐름을 구성하는 것이 다음 목표이다.
클래스 다이어그램
클래스 다이어그램을 조금 다듬었다. 원래 Scene은 UI 상에서 나눌 수 있는 데이터로 취급하려고 했고, 그렇기 때문에 PD Layer에 포함하지는 않았으나, 추후 설계 과정에서 Track을 각 Scene에 종속할 필요성이 생겼고 (추후 해당 장면 내에서 트랙의 순서 등을 제어하기 위함, 트랙의 순서는 단순 디자인뿐만 아니라 실제 처리에서 해당하는 순서의 인덱스를 가져와 처리하는 등 작업 추가 예정), 그렇기 때문에 Scene 이라는 클래스 자체를 구성해서 이 안에 Track을 종속하기로 하였다.
클래스 - Scene
Scene은 장면 하나를 의미하는 클래스! 이 장면 오브젝트 안에 각종 트랙을 인덱스 순서대로 넣을 수 있도록 한다. 이 Scene 인스턴스 하나는 Track을 여러개 담을 수 있다.
클래스 - Track
Track 은 소리 주석 등 원하는 타임라인에 오브젝트를 넣을 수 있도록 하는 부모를 의미한다. 이 트랙안에 여러개의 오브젝트를 시간상으로 배치함으로써 실제 흐름을 구성할 수 있도록 하는 것이 목표이다.
클래스 - Obj
Obj는 하나의 음성 또는 주석을 의미하는 것으로 특정 시간에 배치될 것인지에 대한 정보를 가지고 있다. 예를 들어, 안녕하세요 라는 목소리 녹음본이 있고, 이를 1 트랙의 15초경에 3초 간 재생하는 것이 목표라면, 이 Obj는 StartTime 15, EndTime 18을 가지게 된다. 이러한 Obj는 원하는 Track안에 배치된다.
클래스 - AudioData 또는 ImageData
Data 클래스는 어떤 이미지나 사운드가 처리될 때 버퍼의 역할을 한다. 예를 들어 음성 녹음 1000개가 존재할 때 이 음성 파형 Buffer을 모두 한 번에 로드하면 성능 상 문제가 발생하거나 메모리 사용량 초과의 문제가 발생할 수 있기에, 이를 적절하게 관리할 수 있도록 제어해야 할 필요가 있다. 특정 재생 시간이 되거나 일정 버퍼 내에 있을 때 자동으로 버퍼 로드 요청을 할 수 있고 동적으로 처리 할 수 있도록 클래스를 만들어 관리한다. 평소에는 자동으로 버퍼가 정리되고, 필요할 때 하드디스크로부터 메모리에 탑재할 수 있도록 도와주는 것을 목표로 한다
문제점
현재 클래스 다이어그램에서 존재하는 큰 문제점은 AudioData에 있다. 음성 Obj 클래스를 보면 트랙 내 음성이 시작되고 끝나는 시점은 명시되어 있지만, 내부 파형이 시작되는 위치, 종료되는 위치, 또 어떤 식으로 조작할 수 있도록 할 것 인지에 대한 구성 정보를 담고 있지 아니하다. 따라서 이러한 데이터를 관리할 수 있도록 Attributes를 기존 SoundObj에 넣어야 할 것으로 보인다. 이런 경우 추후 외부에서 사운드 재생이나 합성을 진행할 때 위치를 보간하는 수식 작업을 진행해야 하는데, AudioData 파형을 가져와 한번 더 수식 처리를 해주고 난 뒤의 데이터를 처리해야 하기 때문에 유지 보수가 매우 힘들어진다. 따라서 AudioData를 참조하는 AudioBufferData 라는 클래스를 만들어 원하는 버퍼를 구성할 수 있도록 구성하였다.
AudioBufferData가 추가된 모습
특히 여기서 신경 써야 할 점이 하나 있는데, 상기 언급한 AudioBufferData 역시 여러 Obj에 참조할 수 있도록 할 것인지, 아니면 SoundObj가 하나 만들어지면 이는 1대1 대응으로 고정될 것인지 구성해야 하는데, 이는 요구 사항에 따라 달라질 것으로 보인다.
지금 여기서는 AudioBufferData 한 개를 복수 개 이상의 SoundObj에서 참조할 수 있도록 구성하면 고려해야 할 사항이 많아지기 때문에, 1대1 대응으로 구성하기로 한다. 따라서, 변경 사항은 다음과 같다.
AudioBufferData는 1대1 대응으로 구성
전반적인 클래스 다이어그램