Документация
ОС Аврора 5.1.3
Call.DTMF1
Ниже приведены фрагменты кода или же цельные файлы, которые реализуют интерфейс ru.auroraos.Call.DTMF1.
Содержание:
Объявление интерфейса
-
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); }; -
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); }
Регистрация интерфейса
-
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", {}); } ... }
Удаление интерфейса
-
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(); } }