summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--4a-hal-utilities/4a-hal-utilities-data.h3
-rw-r--r--4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c22
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c4
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c23
4 files changed, 52 insertions, 0 deletions
diff --git a/4a-hal-utilities/4a-hal-utilities-data.h b/4a-hal-utilities/4a-hal-utilities-data.h
index a2f1f1a..62beac8 100644
--- a/4a-hal-utilities/4a-hal-utilities-data.h
+++ b/4a-hal-utilities/4a-hal-utilities-data.h
@@ -28,6 +28,8 @@
#include "4a-hal-utilities-alsa-data.h"
+#define HAL_STREAM_UPDATES_EVENT_NAME "stream-updates"
+
// Enum for sharing hal (controller or external) status
enum HalStatus {
HAL_STATUS_UNAVAILABLE=0,
@@ -52,6 +54,7 @@ struct CtlHalSpecificData {
json_object *halMixerJ;
struct CtlHalMixerData *ctlHalStreamsData;
+ AFB_EventT streamUpdates;
struct CtlHalMixerData *ctlHalPlaybacksData;
struct CtlHalMixerData *ctlHalCapturesData;
diff --git a/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c b/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c
index 4dbe35c..4d42b01 100644
--- a/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c
+++ b/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c
@@ -232,6 +232,8 @@ struct CtlHalMixerData *HalUtlAddStreamDataAndCreateStreamVerb(AFB_ApiT apiHandl
char *verbToCall,
char *streamCardId)
{
+ json_object *streamAddedEventJ;
+
CtlConfigT *ctrlConfig;
struct SpecificHalData *currentSpecificHalData;
@@ -278,6 +280,14 @@ struct CtlHalMixerData *HalUtlAddStreamDataAndCreateStreamVerb(AFB_ApiT apiHandl
return NULL;
}
+ wrap_json_pack(&streamAddedEventJ,
+ "{s:s, s:s, s:s}",
+ "action", "added",
+ "name", createdStreamData->verb,
+ "cardId", createdStreamData->streamCardId);
+
+ AFB_EventPush(currentSpecificHalData->ctlHalSpecificData->streamUpdates, streamAddedEventJ);
+
return createdStreamData;
}
@@ -288,6 +298,8 @@ int8_t HalUtlRemoveStreamDataAndDeleteStreamVerb(AFB_ApiT apiHandle,
{
int8_t returnedErr = 0;
+ json_object *streamRemovedEventJ;
+
CtlConfigT *ctrlConfig;
struct SpecificHalData *currentSpecificHalData;
@@ -307,15 +319,25 @@ int8_t HalUtlRemoveStreamDataAndDeleteStreamVerb(AFB_ApiT apiHandle,
streamCardId)))
return -3;
+ wrap_json_pack(&streamRemovedEventJ,
+ "{s:s, s:s, s:s}",
+ "action", "removed",
+ "name", toRemoveStreamData->verb,
+ "cardId", toRemoveStreamData->streamCardId);
+
if(afb_api_del_verb(apiHandle, verb, NULL)) {
AFB_ApiError(apiHandle,"Error while deleting verb for stream : '%s'", verb);
+ json_object_put(streamRemovedEventJ);
return -4;
}
if((returnedErr = HalUtlRemoveSelectedMixerData(&currentSpecificHalData->ctlHalSpecificData->ctlHalStreamsData, toRemoveStreamData))) {
AFB_ApiError(apiHandle,"Error %i while removing data for stream : '%s'", returnedErr, verb);
+ json_object_put(streamRemovedEventJ);
return -5;
}
+ AFB_EventPush(currentSpecificHalData->ctlHalSpecificData->streamUpdates, streamRemovedEventJ);
+
return 0;
} \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c
index 0f63be7..0691cb5 100644
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c
+++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c
@@ -106,6 +106,10 @@ static int HalCtlsInitOneApi(AFB_ApiT apiHandle)
currentCtlHalData->sndCardId = HalCtlsGetCardIdByCardPath(apiHandle, currentCtlHalData->sndCardPath);
+ currentCtlHalData->ctlHalSpecificData->streamUpdates = AFB_EventMake(apiHandle, HAL_STREAM_UPDATES_EVENT_NAME);
+ if(! AFB_EventIsValid(currentCtlHalData->ctlHalSpecificData->streamUpdates))
+ return -4;
+
if(currentCtlHalData->sndCardId < 0)
currentCtlHalData->status = HAL_STATUS_UNAVAILABLE;
else
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c
index ec00056..f44ea6f 100644
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c
+++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c
@@ -630,6 +630,7 @@ void HalCtlsSubscribeUnsubscribe(AFB_ReqT request, enum SubscribeUnsubscribeType
requestJson = AFB_ReqJson(request);
if(! requestJson) {
AFB_ReqFail(request, "request_json", "Can't get request json");
+ return;
}
if(wrap_json_unpack(requestJson, "{s:o}", "events", &requestedSubscriptionsJ)) {
@@ -665,6 +666,28 @@ void HalCtlsSubscribeUnsubscribe(AFB_ReqT request, enum SubscribeUnsubscribeType
subscriptionFound = 0;
currentSubscriptionString = (char *) json_object_get_string(requestedSubscriptionJ);
+ if(! strcasecmp(currentSubscriptionString, HAL_STREAM_UPDATES_EVENT_NAME)) {
+ if(currentCtlHalData->ctlHalSpecificData->streamUpdates &&
+ subscribeUnsubscribeType == SUBSCRIPTION &&
+ afb_req_subscribe(request, currentCtlHalData->ctlHalSpecificData->streamUpdates)) {
+ AFB_ReqFailF(request,
+ "request_stream_list_updates_event",
+ "Error while trying to subscribe to stream list updates event");
+ return;
+ }
+ else if(currentCtlHalData->ctlHalSpecificData->streamUpdates &&
+ subscribeUnsubscribeType == UNSUBSCRIPTION &&
+ afb_req_unsubscribe(request, currentCtlHalData->ctlHalSpecificData->streamUpdates)) {
+ AFB_ReqFailF(request,
+ "request_stream_list_updates_event",
+ "Error while trying to unsubscribe to stream list updates event");
+ return;
+ }
+
+ subscriptionFound = 1;
+ subscriptionDoneNb++;
+ }
+
currentStreamData = currentCtlHalData->ctlHalSpecificData->ctlHalStreamsData;
while(currentStreamData &&
(! subscriptionFound)) {