Skip to content

Commit

Permalink
refactoring: the ModalityManager is also an IPADataProcessor and no more
Browse files Browse the repository at this point in the history
ClientInput interface is needed
  • Loading branch information
schnelle committed Apr 11, 2024
1 parent cd76c6e commit d1a9bc2
Show file tree
Hide file tree
Showing 10 changed files with 52 additions and 96 deletions.
15 changes: 3 additions & 12 deletions source/w3cipa/w3cipademo/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ int main() {
registry->addIPAProvider(chatGPT);
std::shared_ptr<ProviderSelectionService> providerSelectionService =
std::make_shared<ProviderSelectionService>(registry);

std::shared_ptr<::reference::dialog::ReferenceIPAService> ipaService =
std::make_shared<::reference::dialog::ReferenceIPAService>(providerSelectionService);
providerSelectionService->addIPADataProcessorListener(ipaService);
ipaService->addIPADataProcessorListener(modalityManager);


// Prepare the request
Expand All @@ -69,21 +69,12 @@ int main() {
modalityManager->startInput(listener);

std::shared_ptr<MultiModalInputs> multiModalInputs = listener->getMultiModalInputs();
std::shared_ptr<ClientRequest> request =
std::shared_ptr<IPAData> request =
std::make_shared<ClientRequest>(nullptr, requestId, multiModalInputs,
nullptr, nullptr);

// Actually make the request
std::shared_ptr<ClientResponse> response = ipaService->processInput(request);
if (response == nullptr) {
LOG4CPLUS_ERROR(LOGGER, "no response received");
return -1;
}

// Determine the output and process it
std::shared_ptr<MultiModalOutputs> outputs =
response->getMultiModalOutputs();
modalityManager->handleOutput(outputs);
ipaService->processIPAData(request);

return 0;
}
1 change: 0 additions & 1 deletion source/w3cipa/w3cipaframework/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ set(HEADERS
include/w3c/voiceinteraction/ipa/AudioDeliveryType.h
include/w3c/voiceinteraction/ipa/AudioEncoding.h
include/w3c/voiceinteraction/ipa/CallResult.h
include/w3c/voiceinteraction/ipa/ClientInput.h
include/w3c/voiceinteraction/ipa/ClientRequest.h
include/w3c/voiceinteraction/ipa/ClientResponse.h
include/w3c/voiceinteraction/ipa/CombinedId.h
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class IPADataProcessor {
* Asynchronously notifies all listeners about the processed data.
* @param data the processed data
*/
void notifyListeners(std::shared_ptr<IPAData> data);
void notifyListeners(const std::shared_ptr<IPAData>& data);

private:
/** List of known listeners for processed results. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <stdexcept>

#include "w3c/voiceinteraction/ipa/MultiModalOutputs.h"
#include "w3c/voiceinteraction/ipa/IPADataProcessor.h"
#include "ModalityComponent.h"
#include "InputModalityComponent.h"
#include "InputModalityComponentListener.h"
Expand All @@ -34,8 +35,7 @@ namespace client {
* A component that manages multiple modalities.
* @author Dirk Schnelle-Walka
*/
class ModalityManager
{
class ModalityManager : public IPADataProcessor {

public:
/**
Expand Down Expand Up @@ -72,6 +72,8 @@ class ModalityManager
*/
void startInput(std::shared_ptr<InputModalityComponentListener>& listener) const;

void processIPAData(std::shared_ptr<IPAData> data);

/**
* Handles the provided multimodal output with all known modality handlers.
* @param outputs the outputs to process
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@

#include <memory>

#include "w3c/voiceinteraction/ipa/ClientInput.h"
#include "w3c/voiceinteraction/ipa/external/ProviderSelectionService.h"

namespace w3c {
Expand All @@ -29,7 +28,7 @@ namespace ipa {
* The IPAService is the base class for the IPA service.
* @author Dirk Schnelle-Walka
*/
class IPAService : public ClientInput {
class IPAService {
public:
/**
* Constructs a new object.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ void IPADataProcessor::addIPADataProcessorListener(
listeners.push_back(listener);
}

void IPADataProcessor::notifyListeners(std::shared_ptr<IPAData> data) {
void IPADataProcessor::notifyListeners(const std::shared_ptr<IPAData> &data) {
for (const std::shared_ptr<IPADataProcessor>& listener : listeners) {
std::thread thread([&data, &listener]{
listener->processIPAData(data);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
* [1] https://www.w3.org/Consortium/Legal/copyright-software
*/

#include "w3c/voiceinteraction/ipa/ClientResponse.h"
#include "w3c/voiceinteraction/ipa/client/ModalityManager.h"

namespace w3c {
Expand Down Expand Up @@ -82,6 +83,15 @@ void ModalityManager::startInput(std::shared_ptr<InputModalityComponentListener>
}
}

void ModalityManager::processIPAData(std::shared_ptr<IPAData> data) {
if (std::shared_ptr<ClientResponse> response =
std::dynamic_pointer_cast<ClientResponse>(data)) {
std::shared_ptr<MultiModalOutputs> outputs =
response->getMultiModalOutputs();
handleOutput(outputs);
}
}

void ModalityManager::handleOutput(const std::shared_ptr<MultiModalOutputs>& outputs) const {
std::list<ModalityType> outputModalities = outputs->getModalityTypes();
for (ModalityType& outputModality : outputModalities) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,17 @@ namespace dialog {
*/
class ReferenceIPAService : public IPAService, public IPADataProcessor {
public:
ReferenceIPAService(const std::shared_ptr<ProviderSelectionService>& service);

const std::shared_ptr<ClientResponse> processInput(
const std::shared_ptr<ClientRequest>& request);
ReferenceIPAService(
const std::shared_ptr<ProviderSelectionService>& service);

void processIPAData(std::shared_ptr<IPAData> data);

private:
void processIPAData(std::shared_ptr<ClientRequest> request);

void processIPAData(std::shared_ptr<ExternalClientResponse> request);


/** Logger instance. */
const static log4cplus::Logger LOGGER;
std::mutex mtx;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

#include <log4cplus/loggingmacros.h>

#include <w3c/voiceinteraction/ipa/ClientResponse.h>

#include "w3c/voiceinteraction/ipa/reference/UUIDSessionId.h"
#include "w3c/voiceinteraction/ipa/reference/TextMultiModalOutput.h"
#include "w3c/voiceinteraction/ipa/reference/dialog/ReferenceIPAService.h"
Expand All @@ -34,8 +36,21 @@ ReferenceIPAService::ReferenceIPAService(
: IPAService(service) {
}

const std::shared_ptr<ClientResponse> ReferenceIPAService::processInput(
const std::shared_ptr<ClientRequest> &request) {
void ReferenceIPAService::processIPAData(std::shared_ptr<IPAData> data) {
if (std::shared_ptr<ClientRequest> request =
std::dynamic_pointer_cast<ClientRequest>(data)) {
processIPAData(request);
} else if (std::shared_ptr<ExternalClientResponse> response =
std::dynamic_pointer_cast<ExternalClientResponse>(data)) {
processIPAData(response);
} else {
LOG4CPLUS_WARN(LOGGER,
LOG4CPLUS_TEXT("No valid conversion for the received data"));
}
}

void ReferenceIPAService::processIPAData(
std::shared_ptr<ClientRequest> request) {
// Check if there is already a session identifer and set one if there is
// none
const std::shared_ptr<SessionId>& id = request->getSessionId();
Expand Down Expand Up @@ -71,7 +86,7 @@ const std::shared_ptr<ClientResponse> ReferenceIPAService::processInput(

if (externalResponse == nullptr) {
LOG4CPLUS_ERROR(LOGGER, LOG4CPLUS_TEXT("No valid response received"));
return nullptr;
return;
}

// Create a reply to the client
Expand All @@ -95,20 +110,15 @@ const std::shared_ptr<ClientResponse> ReferenceIPAService::processInput(
externalResponse->getRequestId(),
externalResponse->getMultiModalOutputs(), nullptr, nullptr);
}
return response;
notifyListeners(response);
}

void ReferenceIPAService::processIPAData(std::shared_ptr<IPAData> data) {
if (std::shared_ptr<ExternalClientResponse> response =
std::dynamic_pointer_cast<ExternalClientResponse>(data)) {
std::unique_lock<std::mutex> lck(mtx);
CombinedId combinedId(response->getSessionId(), response->getRequestId());
externalResponses[combinedId] = response;
cv.notify_one();
} else {
LOG4CPLUS_WARN(LOGGER,
LOG4CPLUS_TEXT("No valid conversion for the received data"));
}
void ReferenceIPAService::processIPAData(
std::shared_ptr<ExternalClientResponse> response) {
std::unique_lock<std::mutex> lck(mtx);
CombinedId combinedId(response->getSessionId(), response->getRequestId());
externalResponses[combinedId] = response;
cv.notify_one();
}


Expand Down

0 comments on commit d1a9bc2

Please sign in to comment.