2014-04-25 2 views
0

는 펄스 오디오 DBUS API page은을 LoadModule에 인수가C++ : DBUS API를 통해 PulseAudio 모듈을로드하려면 어떻게해야합니까? {-> 문자열 문자열}</p> <p>또한한다고 {문자열 -> 문자열} 문자열로 사전입니다 : 이름 : : 문자열 인수

인수 것을 말한다 키 및 문자열 값.

어떻게하면 C++ API를 통해 전송할 수 있습니까?

msg = dbus_message_new_method_call(
      "org.PulseAudio1",    //Destination 
      "/org/pulseaudio/core1",     //Object path to call on 
      interfaceStr,        //Interface to call on 
      method);         //Method 

는 그 다음 MSG 반복자 작성 : 일반적으로 나는 이런 식으로 뭔가 할 것이이 같은 매개 변수 목록을 생성

//append arguments to the LoadModule() method. (String, {String->String}) 
dbus_message_iter_init_append(msg, &msgIter); 

dbus_message_iter_append_basic(&msgIter, DBUS_TYPE_STRING,&moduleName); 

//dict entries 
dbus_message_iter_open_container(&msgIter, DBUS_TYPE_DICT_ENTRY, NULL, &subIter); 
dbus_message_iter_append_basic(&subIter, DBUS_TYPE_STRING, &sourceStr); 
dbus_message_iter_append_basic(&subIter, DBUS_TYPE_STRING, &sourcePath); 
dbus_message_iter_close_container(&msgIter, &subIter); 

dbus_message_iter_open_container(&msgIter, DBUS_TYPE_DICT_ENTRY, NULL, &subIter); 
dbus_message_iter_append_basic(&subIter, DBUS_TYPE_STRING, &sinkStr); 
dbus_message_iter_append_basic(&subIter, DBUS_TYPE_STRING, &sinkPath); 
dbus_message_iter_close_container(&msgIter, &subIter); 

을, 나는 생각한다을 LoadModule (문자열, {현악기와> 문자열} {String-> String})

그러나이 함수는 응답을 제공하지 않습니다. 나는 매개 변수를 올바르게 작성하고 있다고 생각하지 않습니다. 사실, 나는 내가 아니라고 확신합니다. 다른 사람들이 다른 메소드에 대해 배열을 사용하는 것을 보았습니다. 그러나 여기에서는이를 지정하지 않았습니다. 특정 항목이 키/값임을 명시하는 방법이 있습니까?

UPDATE : 사전 항목 배열의 엘리먼트이어야하며 기본적인 D 버스 형 키 두 요소의 키 - 값 쌍을 포함한다 :

난이 광고를 발견했다. 도움이 될 경우GNU Using of D-Bus Page,에 입력하십시오. 나는 그것을 시도하고 결과를 게시 할 것입니다.

+0

대신 예상되는 것 "의 {SS}"입니다. 펄스 오디오 클라이언트 라이브러리는 이미 동일한 기능을 수행합니다. U는 구현을 참조 할 수 있습니다. –

+0

loadModule ("모듈 이름", "sink"= "sink/path", "source"= "source/path") 모듈은 다음과 같은 두 개의 dict 항목을 갖기 때문에 @ . 이 모든 것을 s {ss} 인 데이터 구조로 어떻게 보낼 수 있습니까? – MrUser

답변

0

내 업데이트에 따르면 dict 항목은 배열에 있어야하지만 배열의 유일한 요소 일 필요는 없습니다. 예를 들어, 펄스 오디오의 루프백 모듈은 다음과 같이 명령 줄 인수를 취합니다

$pactl load-module module-loopback source="alsa_input.pci-0000_00_1b.0.analog-stereo" sink="bluez_sink.10_B7_F6_02_1B_4A" 

DBUS를 통해이를 보내기 위해이 LoadModule 지시어() 함수는 각각 문자열 키를 포함하는 문자열과 두 DICT 항목을 필요로 ("소스" 또는 "싱크") 및 문자열 값 ("장치 이름"). 내가 처음 의심 한 것처럼 문자열 값은 장치의 PULSEAUDIO 경로가 아닙니다. 그것은 pactl에 사용 된 것과 같은 문자열입니다. s {ss} {ss} 인수를 생성하기 위해서는 먼저 dict 항목을 배열로 캡슐화해야합니다 : s [{ss} {ss}]. 반복자 명령은 다음과 같습니다 당신은 서명 "의 {SS} {SS}"와 DBUS 메시지를 만들려고

//append arguments to the Set() method. (string interface, string property, value) 
dbus_message_iter_init_append(msg, &msgIter); 

    //string 
    dbus_message_iter_append_basic(&msgIter, DBUS_TYPE_STRING,&moduleName); 

    //array 
    dbus_message_iter_open_container(&msgIter,DBUS_TYPE_ARRAY,"{ss}{ss}",&arrayIter); 

     //dict entry 
     dbus_message_iter_open_container(&arrayIter, DBUS_TYPE_DICT_ENTRY, NULL, &dictIter1); 
      //strings 
      dbus_message_iter_append_basic(&dictIter1, DBUS_TYPE_STRING, &sourceStr); 
      dbus_message_iter_append_basic(&dictIter1, DBUS_TYPE_STRING, &sourceName); 
     //close dict entry 
     dbus_message_iter_close_container(&arrayIter, &dictIter1); 

     //dict entry 
     dbus_message_iter_open_container(&arrayIter, DBUS_TYPE_DICT_ENTRY, NULL, &dictIter2); 
      //strings 
      dbus_message_iter_append_basic(&dictIter2, DBUS_TYPE_STRING, &sinkStr); 
      dbus_message_iter_append_basic(&dictIter2, DBUS_TYPE_STRING, &sinkName); 
     //close dict entry 
     dbus_message_iter_close_container(&arrayIter, &dictIter2); 

    //close array 
    dbus_message_iter_close_container(&msgIter, &arrayIter);