2009-11-24 2 views
0

나는 pulseaudio 사운드 서버를 제어하는 ​​C 라이브러리를위한 C# 바인딩을 작성하고 있으며 노출 된 잠재적 인 일시적인 객체, 특히 싱크를 어떻게 관용적으로 바인딩할지는 확신 할 수 없다.아마도 일시적인 객체를 래핑하는 관용적 인 방법

pulseaudio는 오디오 싱크 (audio sink)의 개념을 가지고 있습니다. 주어진 오디오 스트림이 재생되는 하드웨어입니다. 이것은 자연스럽게 Sink 클래스에 매핑되며 볼륨과 같은 몇 가지 명백한 속성이 있습니다. 문제는 핫 플러그 ​​(hotplug)입니다. 런타임 중에 오디오 하드웨어가오고 갈 수 있기 때문에 그러한 하드웨어는 존재하지 않는 하드웨어를 가리키는 좀비로 끝날 수 있습니다. 따라서 수행 된 모든 작업이 실패합니다. 더욱이 C 라이브러리는 싱크에 대한 고유 한 핸들을 제공하지 않으므로 핫 플러그 ​​이벤트 시퀀스는 코드를 알지 못하는 사이에 실제로 Sink 인스턴스가 제어하는 ​​하드웨어를 변경할 수 있습니다.

이러한 두 가지 문제는 모두 발생합니다. Sink 추상화를 제공하고 싶지만 이러한 문제를 피하는 방법을 모르겠습니다.

비슷한 상황에있는 다른 사람들이 어떻게 이런 종류의 문제를 처리 했습니까?

편집 : C 라이브러리에서는 싱크를 쿼리하고 속성을 변경하는 동안 핫 플러그 ​​이벤트가 발생하지 않기를 바랍니다. 싱크는 API에서 인덱스로 식별되지만 안정적이지는 않습니다. 각 싱크에는 적어도 각 실행마다 고유 한 식별자 문자열이 있습니다.

hotplug와 같은 다양한 흥미로운 이벤트에서 콜백을 받기위한 API가 있으므로 Sink을 연결하고 적어도 사라지는 시간을 통보받을 수 있습니다.

+0

C가 어떻게 처리합니까? 당신이 그것을 필요로 할 때마다 싱크대를 간단히 재 쿼리합니까? – JeffreyABecker

+0

소리가 정말 까다로운 문제 같습니다. 나는 폴링을 생각할 수 밖에 없다. 확실히 우아한 솔루션은 아닙니다. –

답변

1

C 라이브러리의이 동작을 C# 라이브러리의 사용자에게 알리려고 노력해야한다고 생각합니다.

내가 펄스 오디오에 익숙하지 않은 해요,하지만 당신이 준 고유 식별자에 대한 정보를 근거로하는 Sink 클래스에 대한 가능한 설계는 다음과 같이 수 :

/// <summary> 
/// Represents a sink. May refer to different hardware. 
/// </summary> 
public class Sink 
{ 
    public static IEnumerable<string> GetCurrentIdentifiers() { ... } 

    public static Sink GetSinkForIdentifier(string identifier) { ... } 

    private Sink() { ... } 
} 

재미있는 읽기 : The Law of Leaky Abstractions

내 생각에 (누설) 추상화를 만들지 않고 단순히 pulseaudio의 개념을 노출하는 것이 좋습니다.

+0

나는 두 가지를 실제로 끝낼 것이라고 생각한다; 싱크대에 대해 더 높은 추상화를 시도 할뿐만 아니라 기본 PulseAudio 개념을 드립을 잡도록 노출시킵니다. – RAOF

0

그냥 HotPlug 이벤트를 수신 한 다음 라이브러리를 사용하여 응용 프로그램에 버블 링 할 수 없습니까? 일반적인 C# 패턴은 Sink 클래스에 대해 INotifyPropertyChanged를 구현하는 것입니다.

0

PulseAudio가 하드웨어 이벤트를 알려주지 않으면 기본적으로이 상황을 처리 할 수 ​​없습니다. PA가 핫 플러그 ​​장치를 다루는 데 어떤 식 으로든 노출되지 않는다는 사실에 놀랐지 만 PA의 C 라이브러리에 패치를 작성해야 정상적으로 처리 할 수 ​​있습니다.

+0

원본 게시물에 몇 가지 추가 정보를 추가했습니다. PA는 핫 플러그 ​​이벤트를 포함하여 다양한 콜백을 제공합니다. 최소한 두 번째 문제 (약간의 오버 헤드가 드는 대가로)는 처리 할 수 ​​있지만 여전히 좀비 씽크가 나옵니다. 라이브러리의 소비자는 모든 작업이 실패한 Sink 개체로 끝나기 때문에 추한 것처럼 보입니다. – RAOF

관련 문제