Документация
ОС Аврора 5.1.3

Call.DTMF1

Ниже приведены фрагменты кода или же цельные файлы, которые реализуют интерфейс ru.auroraos.Call.DTMF1.

Содержание:

Объявление интерфейса

  1. src/callapidbus/dtmf1dbusadaptor.h:

    #include <QtDBus/QDBusAbstractAdaptor>
    #include <QtDBus/QDBusObjectPath>
    
    // Класс Dtmf1DBusAdaptor является D-Bus адаптером для интерфейса управления DTMF-сигналами 
    // (тональный набор, например, нажатия клавиш во время звонка).
    class Dtmf1DBusAdaptor : public QDBusAbstractAdaptor
    {
        Q_OBJECT
        // Явное указание имени интерфейса, под которым этот адаптер будет зарегистрирован в D-Bus
        Q_CLASSINFO("D-Bus Interface", "ru.auroraos.Call.DTMF1")
    
    public:
        // Конструктор принимает родительский QObject (обычно это основной D-Bus объект звонка)
        explicit Dtmf1DBusAdaptor(QObject *parent = nullptr);
    
    public slots:
        // Метод, доступный для вызова клиентами через D-Bus.
        // Принимает строку с тональными сигналами (например, "123#") для отправки в канал связи.
        void SendDTMF(const QString &tones);
    
    signals:
        // Внутренний сигнал Qt, который испускается при получении запроса через D-Bus.
        // Родительский объект должен быть подключен к этому сигналу, чтобы выполнить реальную отправку DTMF.
        void sendDTMFInfo(const QString &tones);
    };
    
  2. src/callapidbus/dtmf1dbusadaptor.cpp:

    #include <QDebug>
    
    #include "dtmf1dbusadaptor.h"
    
    // Конструктор инициализирует базовый класс QDBusAbstractAdaptor.
    // Родительский объект передается в базовый класс для автоматического управления временем жизни.
    Dtmf1DBusAdaptor::Dtmf1DBusAdaptor(QObject *parent)
        : QDBusAbstractAdaptor(parent)
    {
    }
    
    // Реализация метода, вызываемого через D-Bus.
    // Адаптер не содержит бизнес-логики, он просто транслирует запрос в виде сигнала Qt.
    void Dtmf1DBusAdaptor::SendDTMF(const QString &tones)
    {
        // Испускаем сигнал, который будет перехвачен родительским объектом (бизнес-логикой) 
        // для фактической отправки тональных сигналов в аудиопоток звонка.
        emit sendDTMFInfo(tones);
    }
    

Регистрация интерфейса

  1. src/callapidbus/calldbusmanager.cpp:

    void CallDbusManager::registerCall1DBusObject(const bool incoming)
    {
        ...
        // Проверяем, включена ли поддержка интерфейса DTMF для текущего звонка
        if (m_dtmf1Enabled) {
            // Добавляем имя интерфейса "ru.auroraos.Call.DTMF1" в словарь управляемых объектов.
            // Передаем пустой словарь {}, так как этот интерфейс, вероятно, не имеет свойств (properties), 
            // а предоставляет только методы и сигналы. Это требуется стандартом org.freedesktop.DBus.ObjectManager.
            dbusManagedObjects.insert("ru.auroraos.Call.DTMF1", {});
        }
        ...
    }
    

Удаление интерфейса

  1. src/callapidbus/calldbusmanager.cpp:

    void CallDbusManager::handleCallStatusChanged(const uint32_t status)
    {
        // Логируем изменение статуса звонка, преобразуя числовой код статуса в читаемую строку
        qInfo() << QStringLiteral("Статус звонка изменён: %1")
                        .arg(Call1DBusObject::statusToString(status));
                        
        // Обновляем внутреннее состояние текущего статуса звонка
        m_currentCallStatus = Call1DBusObject::CallStatus(status);
        
        // Обрабатываем переход звонка в различные состояния
        if (status == Call1DBusObject::Disconnected) {
            // Если звонок завершен (отключен), выполняем полную очистку D-Bus объектов
            
            // Удаляем запись об объекте из внутреннего словаря управляемых объектов
            m_dbusManagedObjects.remove(m_call1DBusObject.objectPath());
            
            // Формируем список интерфейсов, которые становятся недоступны
            QStringList call1Interfaces = QStringList() << "ru.auroraos.Call.Call1";
            if (m_dtmf1Enabled) {
                // Если DTMF был включен, добавляем его в список удаляемых интерфейсов
                call1Interfaces.append("ru.auroraos.Call.DTMF1");
            }
            
            // Уведомляем всех слушателей в шине D-Bus об удалении этих интерфейсов по данному пути
            emit InterfacesRemoved(m_call1DBusObject.objectPath(), call1Interfaces);
            
            // Физически отменяем регистрацию D-Bus объекта, освобождая ресурсы
            m_call1DBusObject.unregisterCall1DBusObject();
            
        } else if (status == Call1DBusObject::Rejecting) {
            // Если звонок отклоняется, освобождаем аудиоресурс наушника/динамика, 
            // так как он больше не нужен для этого вызова
            m_earpiecePlayer.releaseAudioResource();
            
        } else if (status == Call1DBusObject::Active || status == Call1DBusObject::Held
                || status == Call1DBusObject::Dialing) {
            // Если звонок активен, находится на удержании или в процессе набора номера,
            // запрашиваем и захватываем аудиоресурс наушника для обеспечения звука во время вызова
            m_earpiecePlayer.grantAudioResource();
        }
    }
    

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.