From 6dc974b4b0d8423cc9073e425a2e3a4370160df6 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sun, 27 Oct 2013 07:23:01 -0600 Subject: Add apps/system/nxplayer media player from Ken Pettit --- apps/include/nxplayer.h | 356 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 356 insertions(+) create mode 100644 apps/include/nxplayer.h (limited to 'apps/include') diff --git a/apps/include/nxplayer.h b/apps/include/nxplayer.h new file mode 100644 index 000000000..5932c9928 --- /dev/null +++ b/apps/include/nxplayer.h @@ -0,0 +1,356 @@ +/**************************************************************************** + * apps/system/nxplayer/nxplayer.h + * + * Copyright (C) 2013 Ken Pettit. All rights reserved. + * Author: Ken Pettit + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __APPS_SYSTEM_NXPLAYER_NXPLAYER_H +#define __APPS_SYSTEM_NXPLAYER_NXPLAYER_H 1 + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Type Declarations + ****************************************************************************/ + +struct nxplayer_s +{ + int state; /* Current player state */ + int devFd; /* File descriptor of active device */ + mqd_t mq; /* Message queue for the playthread */ + char mqname[16]; /* Name of our message queue */ + pthread_t playId; /* Thread ID of the playthread */ + int crefs; /* Number of references to the player */ + sem_t sem; /* Thread sync semaphore */ + FILE* fileFd; /* 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 */ +#endif +#ifdef CONFIG_NXPLAYER_INCLUDE_MEDIADIR + char mediadir[CONFIG_NAME_MAX]; /* Root media directory where media is located */ +#endif +#ifdef CONFIG_AUDIO_MULTI_SESSION + FAR void* session; /* Session assigment from device */ +#endif +#ifndef CONFIG_AUDIO_EXCLUDE_VOLUME + 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) */ +#endif +#endif +#ifndef CONFIG_AUDIO_EXCLUDE_TONE + uint16_t treble; /* Treble as a whole % */ + uint16_t bass; /* Bass as a whole % */ +#endif +}; + +typedef int (*nxplayer_func)(FAR struct nxplayer_s* pPlayer, char* pargs); + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: nxplayer_create + * + * Allocates and Initializes a NxPlayer context that is passed to all + * nxplayer routines. The player MUST be destroyed using the + * nxplayer_destroy() routine since the context is reference counted. + * The context can be used in a mode where the caller creates the + * context, starts a file playing, and then forgets about the context + * and it will self free. This is because the nxplayer_playfile + * will also create a reference to the context, so the client calling + * nxplayer_destroy() won't actually de-allocate anything. The freeing + * will occur after the playthread has completed. + * + * Alternately, the caller can create the objec and hold on to it, then + * the context will persist until the original creator destroys it. + * + * Input Parameters: None + * + * Returned values: + * Pointer to created NxPlayer context or NULL if error. + * + **************************************************************************/ + +FAR struct nxplayer_s *nxplayer_create(void); + +/**************************************************************************** + * Name: nxplayer_release + * + * Reduces the reference count to the player and if it reaches zero, + * frees all memory used by the context. + * + * Input Parameters: + * pPlayer Pointer to the NxPlayer context + * + * Returned values: None + * + **************************************************************************/ + +void nxplayer_release(FAR struct nxplayer_s *pPlayer); + +/**************************************************************************** + * Name: nxplayer_reference + * + * Increments the reference count to the player. + * + * Input Parameters: + * pPlayer Pointer to the NxPlayer context + * + * Returned values: None + * + **************************************************************************/ + +void nxplayer_reference(FAR struct nxplayer_s *pPlayer); + +/**************************************************************************** + * Name: nxplayer_setdevice + * + * Sets the preferred Audio device to use with the instance of the + * nxplayer. Without a preferred device set, the nxplayer will search + * the audio subsystem to find a suitable device depending on the + * type of audio operation requested (i.e. an MP3 decoder device when + * playing an MP3 file, a WAV decoder device for a WAV file, etc.). + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * device - Pointer to pathname of the preferred device + * + * Returned values: + * OK if context initialized successfully, error code otherwise. + * + **************************************************************************/ + +int nxplayer_setdevice(FAR struct nxplayer_s *pPlayer, char* device); + +/**************************************************************************** + * Name: nxplayer_playfile + * + * Plays the specified media file (from the filesystem) using the + * Audio system. If a preferred device has been set, that device + * will be used for the playback, otherwise the first suitable device + * found in the /dev/audio directory will be used. + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * filename - Pointer to pathname of the file to play + * filefmt - Format of audio in filename if known, AUDIO_FMT_UNDEF + * to let nxplayer_playfile() determine automatically. + * + * Returned values: + * OK if file found, device found, and playback started. + * + **************************************************************************/ + +int nxplayer_playfile(FAR struct nxplayer_s *pPlayer, char* filename, + int filefmt); + +/**************************************************************************** + * Name: nxplayer_stop + * + * Stops current playback. + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * + * Returned values: + * OK if file found, device found, and playback started. + * + **************************************************************************/ + +#ifndef CONFIG_AUDIO_EXCLUDE_STOP +int nxplayer_stop(FAR struct nxplayer_s *pPlayer); +#endif + +/**************************************************************************** + * Name: nxplayer_pause + * + * Pauses current playback. + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * + * Returned values: + * OK if file found, device found, and playback started. + * + **************************************************************************/ + +#ifndef CONFIG_AUDIO_EXCLUDE_PAUSE_RESUME +int nxplayer_pause(FAR struct nxplayer_s *pPlayer); +#endif + +/**************************************************************************** + * Name: nxplayer_resume + * + * Resuems current playback. + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * + * Returned values: + * OK if file found, device found, and playback started. + * + **************************************************************************/ + +#ifndef CONFIG_AUDIO_EXCLUDE_PAUSE_RESUME +int nxplayer_resume(FAR struct nxplayer_s *pPlayer); +#endif + +/**************************************************************************** + * Name: nxplayer_setvolume + * + * Sets the playback volume. The volume is represented in 1/10th of a + * percent increments, so the range is 0-1000. A value of 10 would mean + * 1%. + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * volume - Volume level to set in 1/10th percent increments + * + * Returned values: + * OK if file found, device found, and playback started. + * + **************************************************************************/ + +#ifndef CONFIG_AUDIO_EXCLUDE_VOLUME +int nxplayer_setvolume(FAR struct nxplayer_s *pPlayer, uint16_t volume); +#endif + +/**************************************************************************** + * Name: nxplayer_setbalance + * + * Sets the playback balance. The balance is represented in 1/10th of a + * percent increments, so the range is 0-1000. A value of 10 would mean + * 1%. + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * balance - Balance level to set in 1/10th percent increments + * + * Returned values: + * OK if file found, device found, and playback started. + * + **************************************************************************/ + +#ifndef CONFIG_AUDIO_EXCLUDE_VOLUME +#ifndef CONFIG_AUDIO_EXCLUDE_BALANCE +int nxplayer_setbalance(FAR struct nxplayer_s *pPlayer, uint16_t balance); +#endif +#endif + +/**************************************************************************** + * Name: nxplayer_setmediadir + * + * Sets the root media directory for non-path qualified file searches. + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * mediadir - Pointer to pathname of the media directory + * + * + **************************************************************************/ + +inline void nxplayer_setmediadir(FAR struct nxplayer_s *pPlayer, char* mediadir); + +/**************************************************************************** + * Name: nxplayer_setbass + * + * Sets the playback bass level. The bass is represented in one percent + * increments, so the range is 0-100. + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * bass - Bass level to set in one percent increments + * + * Returned values: + * OK if file found, device found, and playback started. + * + **************************************************************************/ + +#ifndef CONFIG_AUDIO_EXCLUDE_TONE +int nxplayer_setbass(FAR struct nxplayer_s *pPlayer, uint8_t bass); +#endif + +/**************************************************************************** + * Name: nxplayer_settreble + * + * Sets the playback treble level. The bass is represented in one percent + * increments, so the range is 0-100. + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * treble - Treble level to set in one percent increments + * + * Returned values: + * OK if file found, device found, and playback started. + * + **************************************************************************/ + +#ifndef CONFIG_AUDIO_EXCLUDE_TONE +int nxplayer_settreble(FAR struct nxplayer_s *pPlayer, uint8_t treble); +#endif + +/**************************************************************************** + * Name: nxplayer_systemreset + * + * Performs an audio system reset, including a hardware reset on all + * registered audio devices. + * + * Input Parameters: + * pPlayer - Pointer to the context to initialize + * + * Returned values: + * OK if file found, device found, and playback started. + * + **************************************************************************/ + +#ifdef CONFIG_NXPLAYER_INCLUDE_SYSTEM_RESET +int nxplayer_systemreset(FAR struct nxplayer_s *pPlayer); +#endif + +#endif /* __APPS_SYSTEM_NXPLAYER_NXPLAYER_H */ + -- cgit v1.2.3