42 #include <nuttx/config.h> 53 #include "system/nxplayer.h" 54 #include <nuttx/audio/audio.h> 68 #if !defined(CONFIG_DEBUG_AUDIO) && !defined(CONFIG_DEBUG_GRAPHICS) 71 # ifdef CONFIG_CPP_HAVE_VARARGS 80 #define AUDIO_NSUBSAMPLES 4 92 AUDIO_SUBSAMPLE_2X, AUDIO_SUBSAMPLE_4X, AUDIO_SUBSAMPLE_8X, AUDIO_SUBSAMPLE_16X
105 using namespace NxWM;
129 #if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND) 143 m_player = (FAR
struct nxplayer_s *)0;
148 #ifndef CONFIG_AUDIO_EXCLUDE_VOLUME 151 #if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND) 215 #if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND) 316 gerr(
"ERROR: Failed to configure NxPlayer\n");
324 gerr(
"ERROR: Failed to create widgets\n");
346 #if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND) 402 CONFIG_NXWM_MEDIAPLAYER_BACKGROUNDCOLOR);
446 gerr(
"ERROR: Failed to allocate file path\n");
458 int ret = stat((FAR
const char *)filePath, &buf);
464 gerr(
"ERROR: Could not stat file %s: %d\n", filePath, errcode);
474 if (S_ISDIR(buf.st_mode) || S_ISBLK(buf.st_mode))
476 gerr(
"ERROR: Not a regular file\n");
501 #ifndef CONFIG_AUDIO_EXCLUDE_STOP 507 auderr(
"ERROR: nxplayer_stop failed: %d\n", ret);
544 FAR DIR *dirp = opendir(CONFIG_NXWM_MEDIAPLAYER_MEDIAPATH);
549 CONFIG_NXWIDGETS_DEFAULT_BACKGROUNDCOLOR,
551 CONFIG_NXWM_DEFAULT_SELECTEDBACKGROUNDCOLOR);
557 FAR
struct dirent *direntry;
560 for (direntry = readdir(dirp), index = 0;
562 direntry = readdir(dirp))
567 if (direntry->d_name[0] ==
'.')
572 #if defined(CONFIG_NXWM_MEDIAPLAYER_FILTER) 575 FAR
const char *extension = std::strchr(direntry->d_name,
'.');
576 if (!extension || (
true 577 #
if defined(CONFIG_NXWM_MEDIAPLAYER_FILTER_AC3)
578 && std::strcasecmp(extension,
".ac3") != 0
580 #
if defined(CONFIG_NXWM_MEDIAPLAYER_FILTER_DTS)
581 && std::strcasecmp(extension,
".dts") != 0
583 #
if defined(CONFIG_NXWM_MEDIAPLAYER_FILTER_WAV)
584 && std::strcasecmp(extension,
".wav") != 0
586 #
if defined(CONFIG_NXWM_MEDIAPLAYER_FILTER_PCM)
587 && std::strcasecmp(extension,
".pcm") != 0
589 #
if defined(CONFIG_NXWM_MEDIAPLAYER_FILTER_MP3)
590 && std::strcasecmp(extension,
".mp3") != 0
592 #
if defined(CONFIG_NXWM_MEDIAPLAYER_FILTER_MIDI)
593 && std::strcasecmp(extension,
".mid") != 0
595 #
if defined(CONFIG_NXWM_MEDIAPLAYER_FILTER_WMA)
596 && std::strcasecmp(extension,
".wma") != 0
598 #
if defined(CONFIG_NXWM_MEDIAPLAYER_FILTER_OGGVORBIS)
599 && std::strcasecmp(extension,
".ogg") != 0
612 CONFIG_NXWIDGETS_DEFAULT_ENABLEDTEXTCOLOR,
613 CONFIG_NXWIDGETS_DEFAULT_BACKGROUNDCOLOR,
614 CONFIG_NXWIDGETS_DEFAULT_SELECTEDTEXTCOLOR,
615 CONFIG_NXWM_DEFAULT_SELECTEDBACKGROUNDCOLOR);
621 (void)closedir(dirp);
633 #ifdef CONFIG_NXPLAYER_INCLUDE_PREFERRED_DEVICE 638 int ret = nxplayer_setdevice(
m_player, devPath);
645 #ifdef CONFIG_AUDIO_CUSTOM_DEV_PATH 646 #ifdef CONFIG_AUDIO_DEV_ROOT 647 std::snprintf(path,
sizeof(path),
"/dev/%s", devPath);
649 std::snprintf(path,
sizeof(path), CONFIG_AUDIO_DEV_PATH
"/%s", devPath);
652 std::snprintf(path,
sizeof(path),
"/dev/audio/%s", devPath);
654 ret = nxplayer_setdevice(
m_player, path);
663 gerr(
"ERROR: Device %s not found\n", devPath);
671 gerr(
"ERROR: Device %s is not an audio device\n", devPath);
677 gerr(
"ERROR: Error selecting device %s\n", devPath);
698 gerr(
"ERROR: Failed get NxPlayer handle\n");
702 #ifdef CONFIG_NXPLAYER_INCLUDE_PREFERRED_DEVICE 705 if (!
setDevice(CONFIG_NXWM_MEDIAPLAYER_PREFERRED_DEVICE))
707 gerr(
"ERROR: Failed select NxPlayer audio device\n");
725 CONFIG_NXWM_DEFAULT_FONTCOLOR,
726 CONFIG_NXWM_TRANSPARENT_COLOR);
729 gerr(
"ERROR: Failed to create font\n");
750 gerr(
"ERROR: Failed to one or more bitmaps\n");
758 if (controlH < m_pauseBitmap->getHeight())
763 if (controlH < m_rewindBitmap->getHeight())
768 if (controlH < m_fforwardBitmap->getHeight())
779 CONFIG_NXWM_MEDIAPLAYER_YSPACING;
784 nxgl_coord_t controlTop = volumeTop - controlH -
785 CONFIG_NXWM_MEDIAPLAYER_YSPACING;
790 nxgl_coord_t listHeight = controlTop - CONFIG_NXWM_MEDIAPLAYER_YSPACING;
800 gerr(
"ERROR: Failed to create CListBox\n");
822 nxgl_coord_t playControlW;
823 nxgl_coord_t rewindControlW;
824 nxgl_coord_t fforwardControlW;
826 #ifdef CONFIG_NXWM_MEDIAPLAYER_BORDERS 832 if (imageW < m_pauseBitmap->getWidth())
837 if (imageW < m_rewindBitmap->getWidth())
842 if (imageW < m_fforwardBitmap->getWidth())
850 playControlW = imageW;
851 rewindControlW = imageW;
852 fforwardControlW = imageW;
865 if (playControlW < pauseControlW)
867 playControlW = pauseControlW;
873 nxgl_coord_t playControlX = (
m_windowSize.w >> 1) - (playControlW >> 1);
876 CImage(control, playControlX, controlTop, playControlW, controlH,
881 gerr(
"ERROR: Failed to create play control\n");
890 #ifndef CONFIG_NXWM_MEDIAPLAYER_BORDERS 903 CImage(control, playControlX, controlTop, playControlW, controlH,
908 gerr(
"ERROR: Failed to create pause control\n");
917 #ifndef CONFIG_NXWM_MEDIAPLAYER_BORDERS 929 nxgl_coord_t rewControlX = playControlX - rewindControlW -
930 CONFIG_NXWM_MEDIAPLAYER_XSPACING;
933 CStickyImage(control, rewControlX, controlTop, rewindControlW,
938 gerr(
"ERROR: Failed to create rewind control\n");
947 #ifndef CONFIG_NXWM_MEDIAPLAYER_BORDERS 953 #ifndef CONFIG_AUDIO_EXCLUDE_REWIND 961 nxgl_coord_t fwdControlX = playControlX + playControlW +
962 CONFIG_NXWM_MEDIAPLAYER_XSPACING;
965 CStickyImage(control, fwdControlX, controlTop, fforwardControlW,
970 gerr(
"ERROR: Failed to create fast forward control\n");
979 #ifndef CONFIG_NXWM_MEDIAPLAYER_BORDERS 985 #ifndef CONFIG_AUDIO_EXCLUDE_FFORWARD 993 uint32_t volumeControlX = (9 * (uint32_t)
m_windowSize.w) >> 8;
994 nxgl_coord_t volumeControlW = (nxgl_coord_t)(
m_windowSize.w - 2 * volumeControlX);
999 if (volumeControlH < CONFIG_NXWM_MEDIAPLAYER_MINVOLUMEHEIGHT)
1001 volumeControlH = CONFIG_NXWM_MEDIAPLAYER_MINVOLUMEHEIGHT;
1005 CGlyphSliderHorizontal(control, (nxgl_coord_t)volumeControlX, volumeTop,
1007 CONFIG_NXWM_MEDIAPLAYER_VOLUMECOLOR);
1011 gerr(
"ERROR: Failed to create volume control\n");
1023 #ifndef CONFIG_AUDIO_EXCLUDE_VOLUME 1029 #if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND) 1040 volumeControlX + volumeControlW - motionW,
1041 controlTop + (controlH - motionH) / 2,
1042 motionW, motionH,
"");
1060 #ifndef CONFIG_AUDIO_EXCLUDE_VOLUME 1142 #if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND) 1196 #ifndef CONFIG_AUDIO_EXCLUDE_VOLUME 1231 #ifndef CONFIG_AUDIO_EXCLUDE_VOLUME 1253 #ifndef CONFIG_AUDIO_EXCLUDE_PAUSE_RESUME 1258 #ifndef CONFIG_AUDIO_EXCLUDE_FFORWARD 1265 #ifndef CONFIG_AUDIO_EXCLUDE_REWIND 1291 #ifndef CONFIG_AUDIO_EXCLUDE_FFORWARD 1297 #ifndef CONFIG_AUDIO_EXCLUDE_REWIND 1305 #ifndef CONFIG_AUDIO_EXCLUDE_FFORWARD 1321 #ifndef CONFIG_AUDIO_EXCLUDE_PAUSE_RESUME 1343 #ifndef CONFIG_AUDIO_EXCLUDE_REWIND 1352 #ifndef CONFIG_AUDIO_EXCLUDE_REWIND 1368 #ifndef CONFIG_AUDIO_EXCLUDE_PAUSE_RESUME 1386 #ifndef CONFIG_AUDIO_EXCLUDE_FFORWARD 1402 #if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND) 1417 #ifndef CONFIG_AUDIO_EXCLUDE_VOLUME 1424 if (newLevel < 0 || newLevel > 100)
1426 gerr(
"ERROR: volume is out of range: %d\n", newLevel);
1431 else if ((
int)
m_level != newLevel)
1435 int ret = nxplayer_setvolume(
m_player, (uint16_t)newLevel);
1438 gerr(
"ERROR: nxplayer_setvolume failed: %d\n", ret);
1462 if (newFileIndex < 0)
1510 gerr(
"ERROR: getMediaFile failed\n");
1530 #if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND) 1611 #ifndef CONFIG_AUDIO_EXCLUDE_REWIND 1632 gerr(
"ERROR: nxplayer_rewind failed: %d\n", ret);
1651 gerr(
"ERROR: nxplayer_rewind failed: %d\n", ret);
1661 #ifndef CONFIG_AUDIO_EXCLUDE_FFORWARD 1682 gerr(
"ERROR: nxplayer_fforward failed: %d\n", ret);
1701 gerr(
"ERROR: nxplayer_fforward failed: %d\n", ret);
1730 #ifndef CONFIG_AUDIO_EXCLUDE_PAUSE_RESUME 1735 int ret = nxplayer_resume(
m_player);
1738 gerr(
"ERROR: nxplayer_resume() failed: %d\n", ret);
1761 gerr(
"ERROR: Failed to allocate file path\n");
1769 int ret = nxplayer_playfile(
m_player, (FAR
const char *)filePath,
1770 AUDIO_FMT_UNDEF, AUDIO_FMT_UNDEF);
1773 gerr(
"ERROR: nxplayer_playfile %s failed: %d\n", filePath, ret);
1787 #if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND) 1800 gerr(
"ERROR: nxplayer_cancel_motion failed: %d\n", ret);
1814 #ifndef CONFIG_AUDIO_EXCLUDE_PAUSE_RESUME 1827 int ret = nxplayer_pause(
m_player);
1830 gerr(
"ERROR: nxplayer_pause() failed: %d\n", ret);
1838 #if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND) 1853 gerr(
"ERROR: nxplayer_cancel_motion failed: %d\n", ret);
1887 #ifndef CONFIG_AUDIO_EXCLUDE_VOLUME 1916 gerr(
"ERROR: Failed to create CApplicationWindow\n");
1922 if (!window->
open())
1924 gerr(
"ERROR: Failed to open CApplicationWindow\n");
1935 gerr(
"ERROR: Failed to instantiate CMediaPlayer\n");
CMediaPlayerFactory(CTaskbar *taskbar)
bool isClicked(void) const
const int getValue(void) const
const nxgl_coord_t getHeight(void) const
bool getMediaFile(const NXWidgets::CListBoxDataItem *item)
NXWidgets::CStickyImage * m_rewind
CGraphicsPort * getGraphicsPort(void)
void updateMotionIndicator(void)
NXWidgets::CRlePaletteBitmap * m_volumeBitmap
int compareTo(const CNxString &string) const
enum EMediaPlayerState m_state
void disableDrawing(void)
void setRaisesEvents(bool raises)
bool stopApplication(IApplication *app)
static const uint8_t g_motionSteps[AUDIO_NSUBSAMPLES]
void setValue(const int value)
void setMaximumValue(const int value)
void handleReleaseOutsideEvent(const NXWidgets::CWidgetEventArgs &e)
void checkFileSelection(void)
NXWidgets::CListBox * m_listbox
void append(const CNxString &text)
CMediaPlayer(CTaskbar *taskbar, CApplicationWindow *window)
CApplicationWindow * openApplicationWindow(uint8_t flags=0)
const nxgl_coord_t getWidth(void) const
void alignHorizontalCenter(void)
void setWindowLabel(NXWidgets::CNxString &appname)
const unsigned int getAllocSize(void) const
NXWidgets::CImage * m_play
virtual void setTextAlignmentHoriz(TextAlignmentHoriz alignment)
bool setDevice(FAR const char *devPath)
bool isFullScreen(void) const
const uint8_t getMaxWidth(void) const
void handleActionEvent(const NXWidgets::CWidgetEventArgs &e)
void remove(const int startIndex)
bool showMediaFiles(FAR const char *mediaPath)
virtual bool getSize(FAR struct nxgl_size_s *pSize)=0
bool minimizeApplication(IApplication *app)
NXWidgets::CRlePaletteBitmap * m_rewindBitmap
NXWidgets::CStickyImage * m_fforward
virtual const int getSelectedIndex(void) const
void addWidgetEventHandler(CWidgetEventHandler *eventHandler)
void setVolumeLevel(void)
NXWidgets::CRlePaletteBitmap * m_fforwardBitmap
void block(IApplication *app)
NXWidgets::CNxFont * m_font
void handleReleaseEvent(const NXWidgets::CWidgetEventArgs &e)
NXWidgets::CImage * m_pause
virtual void setFont(CNxFont *font)
void drawFilledRect(nxgl_coord_t x, nxgl_coord_t y, nxgl_coord_t width, nxgl_coord_t height, nxgl_mxpixel_t color)
void setStuckSelection(bool selection)
IApplicationWindow * getWindow(void) const
enum EPendingRelease m_pending
const CNxString & getText(void) const
void setMediaPlayerState(enum EMediaPlayerState state)
void alignVerticalCenter(void)
virtual const CListBoxDataItem * getSelectedOption(void) const
void registerCallbacks(IApplicationCallback *callback)
const uint8_t getHeight(void) const
FAR struct nxplayer_s * m_player
virtual void setTextAlignmentVert(TextAlignmentVert alignment)
bool configureNxPlayer(void)
NXWidgets::INxWindow * getWindow(void) const
NXWidgets::CLabel * m_speed
NXWidgets::CGlyphSliderHorizontal * m_volume
NXWidgets::CWidgetControl * getWidgetControl(void) const
enum EMediaPlayerState m_prevState
NXWidgets::CRlePaletteBitmap * m_pauseBitmap
void setMinimumValue(const int value)
void copyToCharArray(FAR nxwidget_char_t *buffer) const
NXWidgets::IBitmap * getIcon(void)
NXWidgets::CRlePaletteBitmap * m_playBitmap
struct nxgl_size_s m_windowSize
NXWidgets::CNxString m_filePath
virtual void addOption(const CNxString &text, const uint32_t value)
virtual void setAllowMultipleSelections(const bool allowMultipleSelections)
static const NXWidgets::SRlePaletteBitmapEntry bitmap[]
NXWidgets::IBitmap * getIcon(void)
virtual void removeAllOptions(void)
NXWidgets::CNxString getName(void)
CApplicationWindow * m_window
virtual void setFont(CNxFont *font)
void setPageSize(const nxgl_coord_t pageSize)
void handleValueChangeEvent(const NXWidgets::CWidgetEventArgs &e)
virtual void setText(const CNxString &text)
IApplication * create(void)
void setBorderless(bool isBorderless)
bool isHidden(void) const
bool isFullScreen(void) const