aboutsummaryrefslogtreecommitdiffstats
path: root/alsa-binding
diff options
context:
space:
mode:
Diffstat (limited to 'alsa-binding')
-rw-r--r--alsa-binding/Alsa-RegEvt.c189
1 files changed, 39 insertions, 150 deletions
diff --git a/alsa-binding/Alsa-RegEvt.c b/alsa-binding/Alsa-RegEvt.c
index faacb01..389fc1e 100644
--- a/alsa-binding/Alsa-RegEvt.c
+++ b/alsa-binding/Alsa-RegEvt.c
@@ -56,8 +56,6 @@ typedef struct {
int available;
char *pcmFileToMonitor;
- int fd;
- int wd;
sd_event_source *src;
afb_event_t afbevt;
@@ -66,8 +64,6 @@ typedef struct {
} pcmEvtHandleT;
typedef struct {
- int fd;
- int wd;
sd_event_source *src;
afb_event_t afbevt;
} sndCardEvtHandleT;
@@ -182,12 +178,6 @@ STATIC void freePcmHandle(pcmEvtHandleT *pcmEventHandle)
if(afb_event_is_valid(pcmEventHandle->afbevt))
afb_event_unref(pcmEventHandle->afbevt);
- if(pcmEventHandle->fd != -1 && pcmEventHandle->wd != -1)
- inotify_rm_watch(pcmEventHandle->fd, pcmEventHandle->wd);
-
- if(pcmEventHandle->fd != -1)
- close(pcmEventHandle->fd);
-
free(pcmEventHandle->pcmFileToMonitor);
free(pcmEventHandle);
@@ -208,12 +198,6 @@ STATIC void freeSndCardHandle(sndCardEvtHandleT **cardMonitoringHandle)
if(afb_event_is_valid(cardMonitoringHandleToFree->afbevt))
afb_event_unref(cardMonitoringHandleToFree->afbevt);
- if(cardMonitoringHandleToFree->fd != -1 && cardMonitoringHandleToFree->wd != -1)
- inotify_rm_watch(cardMonitoringHandleToFree->fd, cardMonitoringHandleToFree->wd);
-
- if(cardMonitoringHandleToFree->fd != -1)
- close(cardMonitoringHandleToFree->fd);
-
free(cardMonitoringHandleToFree);
*cardMonitoringHandle = NULL;
@@ -420,116 +404,64 @@ STATIC int forceEventRefreshCB(TimerHandleT *context)
}
#endif
-STATIC int pcmEventCB(sd_event_source* src, int fd, uint32_t revents, void* userData)
+STATIC int pcmEventCB(sd_event_source* src, const struct inotify_event *event, void* userData)
{
int err;
- ssize_t length, i = 0;
- char buffer[INOTIFY_EVENT_BUF_LEN];
-
- struct inotify_event *event;
pcmEvtHandleT *pcmEventHandle = (pcmEvtHandleT *) userData;
- if(revents & EPOLLERR) {
- AFB_ERROR("An error has been send by event loop polling, prevent new errors to be fired by deleting event src");
+ if((event->mask & IN_DELETE) || (event->mask & IN_DELETE_SELF)) {
+ AFB_WARNING("Monitored file has been deleted, delete monitoring");
freePcmHandle(pcmEventHandle);
return -1;
}
- if(revents & EPOLLIN) {
- length = read(fd, buffer, INOTIFY_EVENT_BUF_LEN);
- if(length < 0) {
- AFB_ERROR("Nothing read using inotify");
+ if((event->mask & IN_OPEN) || (event->mask & IN_CLOSE)) {
+ err = updatePcmAvailabilityAndFireEvent(pcmEventHandle);
+ if(err) {
+ AFB_ERROR("Error %i happened when tried to refresh %s pcm hw:%i,%i,%i availability",
+ err,
+ (pcmEventHandle->stream == SND_PCM_STREAM_PLAYBACK) ? "playback" : "capture",
+ pcmEventHandle->card,
+ pcmEventHandle->device,
+ pcmEventHandle->subdevice);
freePcmHandle(pcmEventHandle);
return -2;
}
-
- while(i < length) {
- event = (struct inotify_event *) &buffer[i];
-
- i += INOTIFY_EVENT_SIZE + event->len;
-
- if((event->mask & IN_DELETE) || (event->mask & IN_DELETE_SELF)) {
- AFB_WARNING("Monitored file has been deleted, delete monitoring");
- freePcmHandle(pcmEventHandle);
- return -3;
- }
-
- if((event->mask & IN_OPEN) || (event->mask & IN_CLOSE)) {
- err = updatePcmAvailabilityAndFireEvent(pcmEventHandle);
- if(err) {
- AFB_ERROR("Error %i happened when tried to refresh %s pcm hw:%i,%i,%i availability",
- err,
- (pcmEventHandle->stream == SND_PCM_STREAM_PLAYBACK) ? "playback" : "capture",
- pcmEventHandle->card,
- pcmEventHandle->device,
- pcmEventHandle->subdevice);
- return -4;
- }
- }
- }
}
return 0;
}
// This routine is called when sound cards are added/removed (when inotify '/dev/snd/by-path' events are fired)
-STATIC int sndCardEventCB(sd_event_source* src, int fd, uint32_t revents, void* userData)
+STATIC int sndCardEventCB(sd_event_source* src, const struct inotify_event *event, void* userData)
{
- ssize_t length, i = 0;
- char buffer[INOTIFY_EVENT_BUF_LEN];
char *createdFile;
- struct inotify_event *event;
-
sndCardCardFileEventHandleT *createdFileHandle;
TimerHandleT *createdFileTimerHandle;
sndCardsT *sndCards = (sndCardsT *) userData;
- if(revents & EPOLLERR) {
- AFB_ERROR("An error has been send by event loop polling, prevent new errors to be fired by deleting event src");
- freeSndCardHandle(&sndCards->cardMonitoring);
- return -1;
- }
+ if((event->mask & IN_CREATE) &&
+ ! (event->mask & IN_ISDIR) &&
+ (asprintf(&createdFile, "%s/%s", CARD_DIR_TO_WATCH, event->name) > 0)) {
+ createdFileHandle = calloc(1, sizeof(sndCardCardFileEventHandleT));
+ createdFileHandle->createdFileName = strdup(createdFile);
+ createdFileHandle->sndCards = sndCards;
- if(revents & EPOLLIN) {
- length = read(fd, buffer, INOTIFY_EVENT_BUF_LEN);
- if(length < 0) {
- AFB_ERROR("Nothing read using inotify");
- freeSndCardHandle(&sndCards->cardMonitoring);
- return -2;
- }
-
- while(i < length) {
- event = (struct inotify_event *) &buffer[i];
-
- i += INOTIFY_EVENT_SIZE + event->len;
+ createdFileTimerHandle = calloc(1, sizeof(TimerHandleT));
- if(! event->len)
- continue;
-
- if((event->mask & IN_CREATE) &&
- ! (event->mask & IN_ISDIR) &&
- (asprintf(&createdFile, "%s/%s", CARD_DIR_TO_WATCH, event->name) > 0)) {
- createdFileHandle = calloc(1, sizeof(sndCardCardFileEventHandleT));
- createdFileHandle->createdFileName = strdup(createdFile);
- createdFileHandle->sndCards = sndCards;
+ createdFileTimerHandle->uid = "sound card file creation delay";
+ createdFileTimerHandle->count = 10;
+ createdFileTimerHandle->delay = 2;
- createdFileTimerHandle = calloc(1, sizeof(TimerHandleT));
-
- createdFileTimerHandle->uid = "sound card file creation delay";
- createdFileTimerHandle->count = 10;
- createdFileTimerHandle->delay = 2;
-
- TimerEvtStart(sndCards->apiHandle, createdFileTimerHandle, sndCardTimerForCreatedFileCB, (void *) createdFileHandle);
- }
-
- if((event->mask & IN_DELETE) && ! (event->mask & IN_ISDIR))
- updateAllAlsaCardsAvailabilityAndFireEvents(sndCards);
- }
+ TimerEvtStart(sndCards->apiHandle, createdFileTimerHandle, sndCardTimerForCreatedFileCB, (void *) createdFileHandle);
}
+ if((event->mask & IN_DELETE) && ! (event->mask & IN_ISDIR))
+ updateAllAlsaCardsAvailabilityAndFireEvents(sndCards);
+
return 0;
}
@@ -710,8 +642,6 @@ STATIC afb_event_t alsaEvtSubscribeUnsubscribePcmAvailabilityEvent(afb_req_t req
requestedPcmEventHandle->device = device;
requestedPcmEventHandle->subdevice = subdevice;
requestedPcmEventHandle->stream = stream;
- requestedPcmEventHandle->fd = -1;
- requestedPcmEventHandle->wd = -1;
err = asprintf(&requestedPcmEventHandle->pcmFileToMonitor,
PCM_DEV_FILE_STRING,
@@ -757,26 +687,6 @@ STATIC afb_event_t alsaEvtSubscribeUnsubscribePcmAvailabilityEvent(afb_req_t req
free(pcmEventName);
- requestedPcmEventHandle->fd = inotify_init();
- if(requestedPcmEventHandle->fd < 0) {
- afb_req_fail_f(request, "inotify-init", "Error %s happened while getting file descriptor for inotify", strerror(errno));
- freePcmHandle(requestedPcmEventHandle);
- return NULL;
- }
-
- requestedPcmEventHandle->wd = inotify_add_watch(requestedPcmEventHandle->fd,
- requestedPcmEventHandle->pcmFileToMonitor,
- IN_ALL_EVENTS);
- if(requestedPcmEventHandle->wd < 0) {
- afb_req_fail_f(request,
- "inotify-watch",
- "Error %s happened while setting watcher on '%s' file using inotify",
- strerror(errno),
- requestedPcmEventHandle->pcmFileToMonitor);
- freePcmHandle(requestedPcmEventHandle);
- return NULL;
- }
-
requestedPcmEventHandle->available = alsaIsPcmAvailableUsingId(card, device, subdevice, stream);
if(requestedPcmEventHandle->available < 0) {
afb_req_fail_f(request,
@@ -790,12 +700,12 @@ STATIC afb_event_t alsaEvtSubscribeUnsubscribePcmAvailabilityEvent(afb_req_t req
return NULL;
}
- err = sd_event_add_io(afb_daemon_get_event_loop(),
- &requestedPcmEventHandle->src,
- requestedPcmEventHandle->fd,
- EPOLLIN,
- pcmEventCB,
- requestedPcmEventHandle);
+ err = sd_event_add_inotify(afb_daemon_get_event_loop(),
+ &requestedPcmEventHandle->src,
+ requestedPcmEventHandle->pcmFileToMonitor,
+ IN_ALL_EVENTS,
+ pcmEventCB,
+ requestedPcmEventHandle);
if(err < 0) {
afb_req_fail_f(request,
"register-mainloop",
@@ -834,27 +744,6 @@ STATIC afb_event_t alsaEvtSubscribeUnsubscribeSoundCardEvent(afb_req_t request,
return NULL;
}
- sndCards->cardMonitoring->fd = -1;
- sndCards->cardMonitoring->wd = -1;
-
- sndCards->cardMonitoring->fd = inotify_init();
- if(sndCards->cardMonitoring->fd < 0) {
- afb_req_fail_f(request, "inotify-init", "Error %s happened while getting file descriptor for inotify", strerror(errno));
- freeSndCardHandle(&sndCards->cardMonitoring);
- return NULL;
- }
-
- sndCards->cardMonitoring->wd = inotify_add_watch(sndCards->cardMonitoring->fd, CARD_DIR_TO_WATCH, IN_CREATE | IN_DELETE);
- if(sndCards->cardMonitoring->wd < 0) {
- afb_req_fail_f(request,
- "inotify-watch",
- "Error %s happened while setting watcher on '%s' directory using inotify",
- strerror(errno),
- CARD_DIR_TO_WATCH);
- freeSndCardHandle(&sndCards->cardMonitoring);
- return NULL;
- }
-
sndCards->cardMonitoring->afbevt = afb_daemon_make_event("card-monitoring");
if(! afb_event_is_valid(sndCards->cardMonitoring->afbevt)) {
afb_req_fail_f(request, "card-monitoring-event", "Cannot register new binder card-monitoring event");
@@ -863,12 +752,12 @@ STATIC afb_event_t alsaEvtSubscribeUnsubscribeSoundCardEvent(afb_req_t request,
}
// register sound event to binder main loop
- err = sd_event_add_io(afb_daemon_get_event_loop(),
- &sndCards->cardMonitoring->src,
- sndCards->cardMonitoring->fd,
- EPOLLIN,
- sndCardEventCB,
- sndCards);
+ err = sd_event_add_inotify(afb_daemon_get_event_loop(),
+ &sndCards->cardMonitoring->src,
+ CARD_DIR_TO_WATCH,
+ IN_CREATE | IN_DELETE,
+ sndCardEventCB,
+ sndCards);
if(err < 0) {
afb_req_fail_f(request, "register-mainloop", "Cannot hook sound card events to mainloop err=%d", err);
freeSndCardHandle(&sndCards->cardMonitoring);