App development without using the phone

Portions of the conferencing app can be developed without the use of a Dolby Conference Phone, i.e., the Dolby Conference Phone SDK can be used to develop software components that do not require access to some of the API methods such as conference call controls and some UI functions (see Component compatibility table below).

About the SDK

  • Dolby provides an SDK for Linux and a Linux VM.
  • The SDK includes components, web socket libraries, and plugins for conferencing app development. The plugins provide API auto-completion and F1/Help documentation within QT Creator.
  • The Linux VM offers the quickest access to a Linux development environment since it includes the Qt Creator IDE for app development, the Dolby Conference Phone SDK, an NGINX web server, and the syslog server.

Note: The Engine component is only available on the Dolby Conference Phone hardware, so using its API outside of the Dolby Conference Phone is not supported at this time.

Why run the app outside the Dolby Conference Phone?

  • Reduce the app development time
  • More effectively create HTTP backend integration code
  • Quickly iterate on UI implementation and prototypes

Changes needed and limitations

Changes required to run the app outside the Dolby Conference Phone as well as some limitations include:

  • Running an app outside the Dolby Conference Phone is done by executing it in the qmlviewer tool in QT Creator.
  • Developers need to ensure that the main entry file name in the Qt Creator project configuration file points to Servermain.qml.
  • The Engine component is not supported outside of the Dolby Conference Phone.
  • Normally, conferencing app screens are loaded by Engine loaders that are available on the Dolby Conference Phone. When running outside a Dolby Conference Phone, developers must create a local loader to load the screens. This is accomplished by adding code that loads screens and by removing references to Engine.
  • Note that screen loading should be done when the app starts rather than waiting for the Engine signals.

    Page loading example:

    UIApplication {
        // usually this component should NOT be visible but we change this for local run
        width: Screen.width
        height: Screen.height
        // Remove engine references
        // Connections {
        //    target: app
        //    onLaunchApplication: app.loadMainViewFromComponent(myUIPage)
        //    onApplicationWillShow: app.loadMainViewFromComponent(myUIPage)
        // }
        // UITranslationLoader {
        //    source: "resources/qm/app_" + configuration.language.value + ".qm"
        // }
    
        // Load myUiPage screen at start
        Component.onCompleted: {
            loadMainViewFromComponent(myUIPage);
        }
        function loadMainViewFromComponent(component) {
            if(localLoader.sourceComponent === component)
                localLoader.visible = true;
            else
                localLoader.sourceComponent = component;
        }
    
        // Add local loader
        Loader {
            id: localLoader
            width: Screen.width
            height: Screen.height
        }
    }
  • Logging should be done using console.log(), i.e., QML standard logging, since no syslog is available outside the Dolby Conference Phone. This can be solved using wrapper APIs which log to the appropriate destination based on the runtime environment.

    Logging example:

    UIApplication {
    
        // example wrapper API for logging
        function printInfo(msg) {
            try {
                Logger.syslog(LogLevel.INFO, msg);
            }
            catch (err) {
                console.log(msg);
            }
        }
    
        // Web socket test
        WebSocket {
            id: socket
            url: "ws://echo.websocket.org"
            onTextMessageReceived: {
                printInfo("Received message: " + message);
            }
            onStatusChanged: {
              if (socket.status === WebSocket.Error) {
                  printInfo("Error: " + socket.errorString)
              } else if (socket.status === WebSocket.Open) {
                  printInfo("Socket Open");
                  socket.sendTextMessage("Hello World")
              } else if (socket.status === WebSocket.Closed) {
                  printInfo("Socket closed");
              }
            }
            active: true
        }
    }
  • Importing Dolby provided JavaScript libraries is not supported due to Qt bugs/limitations. For example, import "qrc:////qml/Ajax.js" as Ajax will not work. The recommended workaround is to directly import the JavaSript source file such as Ajax.js.

    Note: The Ajax.js user agent string will be different.

    Ajax example:

    import QtQuick 1.1
    import com.dolby.dcp.components 1.0
    import com.dolby.dcp.engine 1.0
    import WebSockets 1.0
    //This won't work due to Qt limitations/bug
    //import "qrc:////qml/Ajax.js" as Ajax
    //work around to run locally, now AJAX lib is available as source in same directory
    import "Ajax.js" as Ajax
    
    UIApplication {
    
        // AJAX Test
        function testAjax() {
            var requestUrl = "http://httpbin.org/headers";
            printInfo("Request URL: " + requestUrl);
            var reqxhr = Ajax.request(
                       {
                           type:'GET',
                           url: requestUrl,
                           contentType:"application/json",
                           headers: {
                               "Content-Type": "application/json; charset=UTF-8",
                               "Accept": "application/json",
                               "User-Agent": "DCP/3.1" // won't work as it's not allowed as per w3c standard
                           },
                           success: function(data, xhr) {
                               printInfo("succeeded");
                               printInfo("Data: " + data);
                               var jsonData = JSON.parse(data);
                           },
                           error: function(data, xhr) {
                               printInfo("HTTP status: " + xhr.status);
                               printInfo("Error data: " + data);
                           }
                       }
                       );
        }
    }
  • Much of the Components library is usable outside the Dolby Conference Phone; however, a few components have Engine dependencies and are not supported. Examples include the soft keyboard component UIKeyboardController, UITextField, et al. Developers should look for equivalent methods in Qt.

    Components example:

    // Example screen
    Component {
        id: myUIPage
        UIOverlay {
            anchors.fill: parent
            // UITextFormField {
            //    width: parent.width - 40
            //    anchors { top: parent.top; topMargin: 10;horizontalCenter: parent.horizontalCenter}
            //    labelText: qsTr("Won't work")
            // }
            UIText {
                anchors.centerIn: parent
                width: parent.width - 40
                text: qsTr("Press join to connect");
            }
            UILabelButton {
                id: joinBUtton
                anchors { horizontalCenter: parent.horizontalCenter; bottom: parent.bottom; bottomMargin: 10}
                iconName: "btn_conference_lg"
                iconWidth: 105
                iconHeight: 105
                labelText: qsTr("Join")
                onClicked: {
                    printInfo("Join clicked")
                    testAjax();
                }
            }
        }
    }

Component compatibility table

The table below shows the component that will work when running outside the Dolby Conference Phone

SDK installation and setup

Details on how to install and set up the Dolby Conference Phone SDK and Linux VM are provided in the Getting started guide.