나는 pulseaudio 사운드 서버를 제어하는 C 라이브러리를위한 C# 바인딩을 작성하고 있으며 노출 된 잠재적 인 일시적인 객체, 특히 싱크를 어떻게 관용적으로 바인딩할지는 확신 할 수 없다.아마도 일시적인 객체를 래핑하는 관용적 인 방법
pulseaudio는 오디오 싱크 (audio sink)의 개념을 가지고 있습니다. 주어진 오디오 스트림이 재생되는 하드웨어입니다. 이것은 자연스럽게 Sink
클래스에 매핑되며 볼륨과 같은 몇 가지 명백한 속성이 있습니다. 문제는 핫 플러그 (hotplug)입니다. 런타임 중에 오디오 하드웨어가오고 갈 수 있기 때문에 그러한 하드웨어는 존재하지 않는 하드웨어를 가리키는 좀비로 끝날 수 있습니다. 따라서 수행 된 모든 작업이 실패합니다. 더욱이 C 라이브러리는 싱크에 대한 고유 한 핸들을 제공하지 않으므로 핫 플러그 이벤트 시퀀스는 코드를 알지 못하는 사이에 실제로 Sink
인스턴스가 제어하는 하드웨어를 변경할 수 있습니다.
이러한 두 가지 문제는 모두 발생합니다. Sink
추상화를 제공하고 싶지만 이러한 문제를 피하는 방법을 모르겠습니다.
비슷한 상황에있는 다른 사람들이 어떻게 이런 종류의 문제를 처리 했습니까?
편집 : C 라이브러리에서는 싱크를 쿼리하고 속성을 변경하는 동안 핫 플러그 이벤트가 발생하지 않기를 바랍니다. 싱크는 API에서 인덱스로 식별되지만 안정적이지는 않습니다. 각 싱크에는 적어도 각 실행마다 고유 한 식별자 문자열이 있습니다.
hotplug와 같은 다양한 흥미로운 이벤트에서 콜백을 받기위한 API가 있으므로 Sink
을 연결하고 적어도 사라지는 시간을 통보받을 수 있습니다.
C가 어떻게 처리합니까? 당신이 그것을 필요로 할 때마다 싱크대를 간단히 재 쿼리합니까? – JeffreyABecker
소리가 정말 까다로운 문제 같습니다. 나는 폴링을 생각할 수 밖에 없다. 확실히 우아한 솔루션은 아닙니다. –