diff --git a/include/system/nxlooper.h b/include/system/nxlooper.h index 51f45c758..becbea97d 100644 --- a/include/system/nxlooper.h +++ b/include/system/nxlooper.h @@ -29,7 +29,6 @@ #include #include -#include /**************************************************************************** * Pre-processor Definitions @@ -43,30 +42,30 @@ struct nxlooper_s { - int loopstate; /* Current looper test state */ - int recorddev_fd; /* File descriptor of active - * record device */ - char recorddev[CONFIG_NAME_MAX]; /* Preferred record device */ - int playdev_fd; /* File descriptor of active - * play device */ - char playdev[CONFIG_NAME_MAX]; /* Preferred loopback device */ - int crefs; /* Number of references */ - sem_t sem; /* Thread sync semaphore */ - char mqname[16]; /* Name of play message queue */ - mqd_t mq; /* Message queue for the - * loopthread */ - pthread_t loop_id; /* Thread ID of the loopthread */ + int loopstate; /* Current looper test state */ + int recorddev_fd; /* File descriptor of active + * record device */ + char recorddev[CONFIG_NAME_MAX]; /* Preferred record device */ + int playdev_fd; /* File descriptor of active + * play device */ + char playdev[CONFIG_NAME_MAX]; /* Preferred loopback device */ + int crefs; /* Number of references */ + pthread_mutex_t mutex; /* Thread sync mutex */ + char mqname[16]; /* Name of play message queue */ + mqd_t mq; /* Message queue for the + * loopthread */ + pthread_t loop_id; /* Thread ID of the loopthread */ #ifdef CONFIG_AUDIO_MULTI_SESSION - FAR void *pplayses; /* Session assignment from device */ + FAR void *pplayses; /* Session assignment from device */ #endif #ifdef CONFIG_AUDIO_MULTI_SESSION - FAR void *precordses; /* Session assignment from device */ + FAR void *precordses; /* Session assignment from device */ #endif #ifndef CONFIG_AUDIO_EXCLUDE_VOLUME - uint16_t volume; /* Volume as a whole percentage (0-100) */ + uint16_t volume; /* Volume as a whole percentage (0-100) */ #endif }; diff --git a/include/system/nxplayer.h b/include/system/nxplayer.h index cc8e01879..ba2c65630 100644 --- a/include/system/nxplayer.h +++ b/include/system/nxplayer.h @@ -29,7 +29,6 @@ #include #include -#include /**************************************************************************** * Pre-processor Definitions @@ -51,34 +50,34 @@ struct nxplayer_dec_ops_s struct nxplayer_s { - int state; /* Current player state */ - int dev_fd; /* File descriptor of active device */ - mqd_t mq; /* Message queue for the playthread */ - char mqname[16]; /* Name of our message queue */ - pthread_t play_id; /* Thread ID of the playthread */ - int crefs; /* Number of references to the player */ - sem_t sem; /* Thread sync semaphore */ - int fd; /* File descriptor of open file */ + int state; /* Current player state */ + int dev_fd; /* File descriptor of active device */ + mqd_t mq; /* Message queue for the playthread */ + char mqname[16]; /* Name of our message queue */ + pthread_t play_id; /* Thread ID of the playthread */ + int crefs; /* Number of references to the player */ + pthread_mutex_t mutex; /* Thread sync mutex */ + int fd; /* File descriptor of open file */ #ifdef CONFIG_NXPLAYER_INCLUDE_PREFERRED_DEVICE - char prefdevice[CONFIG_NAME_MAX]; /* Preferred audio device */ - int prefformat; /* Formats supported by preferred device */ - int preftype; /* Types supported by preferred device */ + char prefdevice[CONFIG_NAME_MAX]; /* Preferred audio device */ + int prefformat; /* Formats supported by preferred device */ + int preftype; /* Types supported by preferred device */ #endif #ifdef CONFIG_NXPLAYER_INCLUDE_MEDIADIR - char mediadir[CONFIG_NAME_MAX]; /* Root media directory where media is located */ + char mediadir[CONFIG_NAME_MAX]; /* Root media directory where media is located */ #endif #ifdef CONFIG_AUDIO_MULTI_SESSION - FAR void *session; /* Session assignment from device */ + FAR void *session; /* Session assignment from device */ #endif #ifndef CONFIG_AUDIO_EXCLUDE_VOLUME - uint16_t volume; /* Volume as a whole percentage (0-100) */ + uint16_t volume; /* Volume as a whole percentage (0-100) */ #ifndef CONFIG_AUDIO_EXCLUDE_BALANCE - uint16_t balance; /* Balance as a whole % (0=left off, 100=right off) */ + uint16_t balance; /* Balance as a whole % (0=left off, 100=right off) */ #endif #endif #ifndef CONFIG_AUDIO_EXCLUDE_TONE - uint16_t treble; /* Treble as a whole % */ - uint16_t bass; /* Bass as a whole % */ + uint16_t treble; /* Treble as a whole % */ + uint16_t bass; /* Bass as a whole % */ #endif FAR const struct nxplayer_dec_ops_s *ops; diff --git a/include/system/nxrecorder.h b/include/system/nxrecorder.h index b632c4a2d..129a23170 100644 --- a/include/system/nxrecorder.h +++ b/include/system/nxrecorder.h @@ -29,7 +29,6 @@ #include #include -#include /**************************************************************************** * Pre-processor Definitions @@ -43,17 +42,17 @@ struct nxrecorder_s { - int state; /* Current recorder state */ - int dev_fd; /* File descriptor of active device */ - mqd_t mq; /* Message queue for the recordthread */ - char mqname[16]; /* Name of our message queue */ - pthread_t record_id; /* Thread ID of the recordthread */ - int crefs; /* Number of references to the recorder */ - sem_t sem; /* Thread sync semaphore */ - int fd; /* File descriptor of open file */ - char device[CONFIG_NAME_MAX]; /* Preferred audio device */ + int state; /* Current recorder state */ + int dev_fd; /* File descriptor of active device */ + mqd_t mq; /* Message queue for the recordthread */ + char mqname[16]; /* Name of our message queue */ + pthread_t record_id; /* Thread ID of the recordthread */ + int crefs; /* Number of references to the recorder */ + pthread_mutex_t mutex; /* Thread sync mutex */ + int fd; /* File descriptor of open file */ + char device[CONFIG_NAME_MAX]; /* Preferred audio device */ #ifdef CONFIG_AUDIO_MULTI_SESSION - FAR void *session; /* Session assignment from device */ + FAR void *session; /* Session assignment from device */ #endif }; diff --git a/system/nxlooper/nxlooper.c b/system/nxlooper/nxlooper.c index 5efb39d7f..90cec746e 100644 --- a/system/nxlooper/nxlooper.c +++ b/system/nxlooper/nxlooper.c @@ -670,9 +670,7 @@ err_out: /* Cleanup */ - while (sem_wait(&plooper->sem) < 0) - { - } + pthread_mutex_lock(&plooper->mutex); close(plooper->playdev_fd); /* Close the play device */ close(plooper->recorddev_fd); /* Close the record device */ @@ -682,7 +680,7 @@ err_out: mq_unlink(plooper->mqname); /* Unlink the message queue */ plooper->loopstate = NXLOOPER_STATE_IDLE; - sem_post(&plooper->sem); /* Release the semaphore */ + pthread_mutex_unlock(&plooper->mutex); audinfo("Exit\n"); @@ -706,10 +704,7 @@ int nxlooper_setvolume(FAR struct nxlooper_s *plooper, uint16_t volume) struct audio_caps_desc_s cap_desc; int ret; - /* Thread sync using the semaphore */ - - while (sem_wait(&plooper->sem) < 0) - ; + pthread_mutex_lock(&plooper->mutex); /* If we are currently looping, then we need to post a message to * the loopthread to perform the volume change operation. If we @@ -735,7 +730,7 @@ int nxlooper_setvolume(FAR struct nxlooper_s *plooper, uint16_t volume) DEBUGASSERT(errcode > 0); auderr("ERROR: AUDIOIOC_CONFIGURE ioctl failed: %d\n", errcode); - sem_post(&plooper->sem); + pthread_mutex_unlock(&plooper->mutex); return -errcode; } } @@ -743,7 +738,7 @@ int nxlooper_setvolume(FAR struct nxlooper_s *plooper, uint16_t volume) /* Store the volume setting */ plooper->volume = volume; - sem_post(&plooper->sem); + pthread_mutex_unlock(&plooper->mutex); return OK; } @@ -915,14 +910,14 @@ int nxlooper_stop(FAR struct nxlooper_s *plooper) /* Validate we are not in IDLE state */ - sem_wait(&plooper->sem); /* Get the semaphore */ + pthread_mutex_lock(&plooper->mutex); if (plooper->loopstate == NXLOOPER_STATE_IDLE) { - sem_post(&plooper->sem); /* Release the semaphore */ + pthread_mutex_unlock(&plooper->mutex); return OK; } - sem_post(&plooper->sem); + pthread_mutex_unlock(&plooper->mutex); /* Notify the loopback thread that it needs to cancel the loopback */ @@ -1207,7 +1202,7 @@ FAR struct nxlooper_s *nxlooper_create(void) plooper->precordses = NULL; #endif - sem_init(&plooper->sem, 0, 1); + pthread_mutex_init(&plooper->mutex, NULL); return plooper; } @@ -1230,45 +1225,23 @@ void nxlooper_release(FAR struct nxlooper_s *plooper) int refcount; FAR void *value; - /* Grab the semaphore */ - - while (sem_wait(&plooper->sem) < 0) - { - int errcode = errno; - DEBUGASSERT(errcode > 0); - - if (errcode != EINTR) - { - auderr("ERROR: sem_wait failed: %d\n", errcode); - return; - } - } + pthread_mutex_lock(&plooper->mutex); /* Check if there was a previous thread and join it if there was */ if (plooper->loop_id != 0) { - sem_post(&plooper->sem); + pthread_mutex_unlock(&plooper->mutex); pthread_join(plooper->loop_id, &value); plooper->loop_id = 0; - while (sem_wait(&plooper->sem) < 0) - { - int errcode = errno; - DEBUGASSERT(errcode > 0); - - if (errcode != EINTR) - { - auderr("ERROR: sem_wait failed: %d\n", errcode); - return; - } - } + pthread_mutex_lock(&plooper->mutex); } /* Reduce the reference count */ refcount = plooper->crefs--; - sem_post(&plooper->sem); + pthread_mutex_unlock(&plooper->mutex); /* If the ref count *was* one, then free the context */ @@ -1292,24 +1265,12 @@ void nxlooper_release(FAR struct nxlooper_s *plooper) void nxlooper_reference(FAR struct nxlooper_s *plooper) { - /* Grab the semaphore */ - - while (sem_wait(&plooper->sem) < 0) - { - int errcode = errno; - DEBUGASSERT(errcode > 0); - - if (errcode != EINTR) - { - auderr("ERROR: sem_wait failed: %d\n", errcode); - return; - } - } + pthread_mutex_lock(&plooper->mutex); /* Increment the reference count */ plooper->crefs++; - sem_post(&plooper->sem); + pthread_mutex_unlock(&plooper->mutex); } /**************************************************************************** diff --git a/system/nxplayer/nxplayer.c b/system/nxplayer/nxplayer.c index ea80e1e44..bde36980d 100644 --- a/system/nxplayer/nxplayer.c +++ b/system/nxplayer/nxplayer.c @@ -1113,8 +1113,7 @@ err_out: /* Cleanup */ - while (sem_wait(&pplayer->sem) < 0) - ; + pthread_mutex_lock(&pplayer->mutex); /* Close the files */ @@ -1131,7 +1130,7 @@ err_out: pplayer->ops = NULL; /* Clear offload parser */ pplayer->state = NXPLAYER_STATE_IDLE; /* Go to IDLE */ - sem_post(&pplayer->sem); /* Release the semaphore */ + pthread_mutex_unlock(&pplayer->mutex); /* The playthread is done with the context. Release it, which may * actually cause the context to be freed if the creator has already @@ -1162,10 +1161,7 @@ int nxplayer_setvolume(FAR struct nxplayer_s *pplayer, uint16_t volume) struct audio_caps_desc_s cap_desc; int ret; - /* Thread sync using the semaphore */ - - while (sem_wait(&pplayer->sem) < 0) - ; + pthread_mutex_lock(&pplayer->mutex); /* If we are currently playing, then we need to post a message to * the playthread to perform the volume change operation. If we @@ -1192,7 +1188,7 @@ int nxplayer_setvolume(FAR struct nxplayer_s *pplayer, uint16_t volume) DEBUGASSERT(errcode > 0); auderr("ERROR: AUDIOIOC_CONFIGURE ioctl failed: %d\n", errcode); - sem_post(&pplayer->sem); + pthread_mutex_unlock(&pplayer->mutex); return -errcode; } } @@ -1200,7 +1196,7 @@ int nxplayer_setvolume(FAR struct nxplayer_s *pplayer, uint16_t volume) /* Store the volume setting */ pplayer->volume = volume; - sem_post(&pplayer->sem); + pthread_mutex_unlock(&pplayer->mutex); return OK; } @@ -1250,10 +1246,7 @@ int nxplayer_setbass(FAR struct nxplayer_s *pplayer, uint8_t level) { struct audio_caps_desc_s cap_desc; - /* Thread sync using the semaphore */ - - while (sem_wait(&pplayer->sem) < 0) - ; + pthread_mutex_lock(&pplayer->mutex); /* If we are currently playing, then we need to post a message to * the playthread to perform the volume change operation. If we @@ -1279,7 +1272,7 @@ int nxplayer_setbass(FAR struct nxplayer_s *pplayer, uint8_t level) pplayer->bass = level; - sem_post(&pplayer->sem); + pthread_mutex_unlock(&pplayer->mutex); return -ENOENT; } @@ -1302,10 +1295,7 @@ int nxplayer_settreble(FAR struct nxplayer_s *pplayer, uint8_t level) { struct audio_caps_desc_s cap_desc; - /* Thread sync using the semaphore */ - - while (sem_wait(&pplayer->sem) < 0) - ; + pthread_mutex_lock(&pplayer->mutex); /* If we are currently playing, then we need to post a message to * the playthread to perform the volume change operation. If we @@ -1331,7 +1321,7 @@ int nxplayer_settreble(FAR struct nxplayer_s *pplayer, uint8_t level) pplayer->treble = level; - sem_post(&pplayer->sem); + pthread_mutex_unlock(&pplayer->mutex); return -ENOENT; } @@ -1350,10 +1340,7 @@ int nxplayer_setbalance(FAR struct nxplayer_s *pplayer, uint16_t balance) { struct audio_caps_desc_s cap_desc; - /* Thread sync using the semaphore */ - - while (sem_wait(&pplayer->sem) < 0) - ; + pthread_mutex_lock(&pplayer->mutex); /* If we are currently playing, then we need to post a message to * the playthread to perform the volume change operation. If we @@ -1379,7 +1366,7 @@ int nxplayer_setbalance(FAR struct nxplayer_s *pplayer, uint16_t balance) pplayer->balance = balance; - sem_post(&pplayer->sem); + pthread_mutex_unlock(&pplayer->mutex); return -ENOENT; } @@ -1689,14 +1676,14 @@ int nxplayer_stop(FAR struct nxplayer_s *pplayer) /* Validate we are not in IDLE state */ - sem_wait(&pplayer->sem); /* Get the semaphore */ + pthread_mutex_lock(&pplayer->mutex); if (pplayer->state == NXPLAYER_STATE_IDLE) { - sem_post(&pplayer->sem); /* Release the semaphore */ + pthread_mutex_unlock(&pplayer->mutex); return OK; } - sem_post(&pplayer->sem); + pthread_mutex_unlock(&pplayer->mutex); /* Notify the playback thread that it needs to cancel the playback */ @@ -2150,7 +2137,8 @@ FAR struct nxplayer_s *nxplayer_create(void) strncpy(pplayer->mediadir, CONFIG_NXPLAYER_DEFAULT_MEDIADIR, sizeof(pplayer->mediadir)); #endif - sem_init(&pplayer->sem, 0, 1); + + pthread_mutex_init(&pplayer->mutex, NULL); return pplayer; } @@ -2173,45 +2161,23 @@ void nxplayer_release(FAR struct nxplayer_s *pplayer) int refcount; FAR void *value; - /* Grab the semaphore */ - - while (sem_wait(&pplayer->sem) < 0) - { - int errcode = errno; - DEBUGASSERT(errcode > 0); - - if (errcode != EINTR) - { - auderr("ERROR: sem_wait failed: %d\n", errcode); - return; - } - } + pthread_mutex_lock(&pplayer->mutex); /* Check if there was a previous thread and join it if there was */ if (pplayer->play_id != 0) { - sem_post(&pplayer->sem); + pthread_mutex_unlock(&pplayer->mutex); pthread_join(pplayer->play_id, &value); pplayer->play_id = 0; - while (sem_wait(&pplayer->sem) < 0) - { - int errcode = errno; - DEBUGASSERT(errcode > 0); - - if (errcode != -EINTR) - { - auderr("ERROR: sem_wait failed: %d\n", errcode); - return; - } - } + pthread_mutex_lock(&pplayer->mutex); } /* Reduce the reference count */ refcount = pplayer->crefs--; - sem_post(&pplayer->sem); + pthread_mutex_unlock(&pplayer->mutex); /* If the ref count *was* one, then free the context */ @@ -2235,67 +2201,12 @@ void nxplayer_release(FAR struct nxplayer_s *pplayer) void nxplayer_reference(FAR struct nxplayer_s *pplayer) { - /* Grab the semaphore */ - - while (sem_wait(&pplayer->sem) < 0) - { - int errcode = errno; - DEBUGASSERT(errcode > 0); - - if (errcode != -EINTR) - { - auderr("ERROR: sem_wait failed: %d\n", errcode); - return; - } - } + pthread_mutex_lock(&pplayer->mutex); /* Increment the reference count */ pplayer->crefs++; - sem_post(&pplayer->sem); -} - -/**************************************************************************** - * Name: nxplayer_detach - * - * nxplayer_detach() detaches from the playthread to make it independent - * so the caller can abandon the context while the file is still - * being played. - * - * Input Parameters: - * pplayer Pointer to the NxPlayer context - * - * Returned values: None - * - ****************************************************************************/ - -void nxplayer_detach(FAR struct nxplayer_s *pplayer) -{ -#if 0 - /* Grab the semaphore */ - - while (sem_wait(&pplayer->sem) < 0) - { - int errcode = errno; - DEBUGASSERT(errcode > 0); - - if (errcode != -EINTR) - { - auderr("ERROR: sem_wait failed: %d\n", errcode); - return; - } - } - - if (pplayer->play_id != NULL) - { - /* Do a pthread detach */ - - pthread_detach(pplayer->play_id); - pplayer->play_id = NULL; - } - - sem_post(&pplayer->sem); -#endif + pthread_mutex_unlock(&pplayer->mutex); } /**************************************************************************** diff --git a/system/nxplayer/nxplayer_main.c b/system/nxplayer/nxplayer_main.c index f28cfe239..052fadab8 100644 --- a/system/nxplayer/nxplayer_main.c +++ b/system/nxplayer/nxplayer_main.c @@ -837,8 +837,6 @@ int main(int argc, FAR char *argv[]) /* Release the NxPlayer context */ - /* nxplayer_detach(pplayer); */ - nxplayer_release(pplayer); return OK; diff --git a/system/nxrecorder/nxrecorder.c b/system/nxrecorder/nxrecorder.c index 7f4054537..83fdd3186 100644 --- a/system/nxrecorder/nxrecorder.c +++ b/system/nxrecorder/nxrecorder.c @@ -566,9 +566,7 @@ err_out: /* Cleanup */ - while (sem_wait(&precorder->sem) < 0) - { - } + pthread_mutex_lock(&precorder->mutex); /* Close the files */ @@ -584,7 +582,7 @@ err_out: mq_unlink(precorder->mqname); /* Unlink the message queue */ precorder->state = NXRECORDER_STATE_IDLE; /* Go to IDLE */ - sem_post(&precorder->sem); /* Release the semaphore */ + pthread_mutex_unlock(&precorder->mutex); /* The record thread is done with the context. Release it, which may * actually cause the context to be freed if the creator has already @@ -718,14 +716,14 @@ int nxrecorder_stop(FAR struct nxrecorder_s *precorder) /* Validate we are not in IDLE state */ - sem_wait(&precorder->sem); /* Get the semaphore */ + pthread_mutex_lock(&precorder->mutex); if (precorder->state == NXRECORDER_STATE_IDLE) { - sem_post(&precorder->sem); /* Release the semaphore */ + pthread_mutex_unlock(&precorder->mutex); return OK; } - sem_post(&precorder->sem); + pthread_mutex_unlock(&precorder->mutex); /* Notify the recordback thread that it needs to cancel the recordback */ @@ -976,7 +974,7 @@ FAR struct nxrecorder_s *nxrecorder_create(void) precorder->session = NULL; #endif - sem_init(&precorder->sem, 0, 1); + pthread_mutex_init(&precorder->mutex, NULL); return precorder; } @@ -999,50 +997,29 @@ void nxrecorder_release(FAR struct nxrecorder_s *precorder) int refcount; FAR void *value; - /* Grab the semaphore */ - - while (sem_wait(&precorder->sem) < 0) - { - int errcode = errno; - DEBUGASSERT(errcode > 0); - - if (errcode != EINTR) - { - auderr("ERROR: sem_wait failed: %d\n", errcode); - return; - } - } + pthread_mutex_lock(&precorder->mutex); /* Check if there was a previous thread and join it if there was */ if (precorder->record_id != 0) { - sem_post(&precorder->sem); + pthread_mutex_unlock(&precorder->mutex); pthread_join(precorder->record_id, &value); precorder->record_id = 0; - while (sem_wait(&precorder->sem) < 0) - { - int errcode = errno; - DEBUGASSERT(errcode > 0); - - if (errcode != EINTR) - { - auderr("ERROR: sem_wait failed: %d\n", errcode); - return; - } - } + pthread_mutex_lock(&precorder->mutex); } /* Reduce the reference count */ refcount = precorder->crefs--; - sem_post(&precorder->sem); + pthread_mutex_unlock(&precorder->mutex); /* If the ref count *was* one, then free the context */ if (refcount == 1) { + pthread_mutex_destroy(&precorder->mutex); free(precorder); } } @@ -1061,22 +1038,10 @@ void nxrecorder_release(FAR struct nxrecorder_s *precorder) void nxrecorder_reference(FAR struct nxrecorder_s *precorder) { - /* Grab the semaphore */ - - while (sem_wait(&precorder->sem) < 0) - { - int errcode = errno; - DEBUGASSERT(errcode > 0); - - if (errcode != EINTR) - { - auderr("ERROR: sem_wait failed: %d\n", errcode); - return; - } - } + pthread_mutex_lock(&precorder->mutex); /* Increment the reference count */ precorder->crefs++; - sem_post(&precorder->sem); + pthread_mutex_unlock(&precorder->mutex); }