19 Commits

Author SHA1 Message Date
61a141203b Bump liberty and version, update NEWS 2021-12-21 05:46:28 +01:00
48482ef2e5 Make incremental search more useful
Make it unanchored, as well as case-insensitive.
2021-12-21 05:46:22 +01:00
840c69767c Prepare a NEWS entry for the next release 2021-12-08 19:05:58 +01:00
a14a907b18 Indicate that a stream download is in progress 2021-12-08 18:58:03 +01:00
333049de01 Do not run cURL fully synchronously
The improvement is very minor in character.
2021-12-08 18:23:30 +01:00
4e3596db35 Add rudimentary incremental search facility 2021-12-08 17:23:25 +01:00
5aa07fd8af Clean up mpd_process_info() better 2021-12-07 20:38:02 +01:00
2060da4a8e Do not jump to beginning after unqueueing
Instead, assume that the whole previously selected range
has been removed, and try to go after or before it accordingly.
2021-12-07 20:34:32 +01:00
f5b5cec340 Clean up unreadable code 2021-12-07 20:10:35 +01:00
1a671dfad5 Document PulseAudio integration 2021-11-16 05:17:15 +01:00
587a02fa15 Indent man page snippets with spaces 2021-11-16 05:16:51 +01:00
227b8e0fa2 Do not show both volumes if unnecessary
Also, make it apparent which value comes from where.
2021-11-16 04:48:52 +01:00
e66e9f249a Rename an action to be shorter
Also, fix make dependencies to include the source file for actions.
2021-11-16 04:48:52 +01:00
32203f8117 Fix the comment for settings.pulseaudio 2021-11-08 07:23:08 +01:00
6b871898d8 Fix build on macOS and other non-GNU systems 2021-11-08 06:36:01 +01:00
4598c45d2f Generate actions from a text file
Mostly because I wanted to nest preprocessing.

This makes the build more complex and slightly less portable,
but the code itself is much cleaner.
2021-11-08 06:07:04 +01:00
66c77c3f8d Update README 2021-11-07 23:21:32 +01:00
7165a8eb02 Add ability to control PulseAudio volume
I know, son, it might be hard to accept,
but you're imported.  Your true parents are wmstatus
and paswitch, from the desktop-tools family.

Also, fix unnecessary linking of optional dependencies.
2021-11-07 23:07:55 +01:00
87b57bb24c Add a comment about the music directory 2021-11-07 13:29:13 +01:00
8 changed files with 726 additions and 212 deletions

View File

@@ -1,5 +1,5 @@
cmake_minimum_required (VERSION 3.0) cmake_minimum_required (VERSION 3.0)
project (nncmpp VERSION 1.1.1 LANGUAGES C) project (nncmpp VERSION 1.2.0 LANGUAGES C)
# Moar warnings # Moar warnings
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC) if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
@@ -46,12 +46,23 @@ if (WITH_FFTW)
if (NOT fftw_FOUND) if (NOT fftw_FOUND)
message (FATAL_ERROR "FFTW not found") message (FATAL_ERROR "FFTW not found")
endif () endif ()
list (APPEND extra_libraries ${fftw_LIBRARIES})
endif ()
pkg_check_modules (libpulse libpulse)
option (WITH_PULSE "Enable control of PulseAudio sink volume" ${libpulse_FOUND})
if (WITH_PULSE)
if (NOT libpulse_FOUND)
message (FATAL_ERROR "libpulse not found")
endif ()
list (APPEND extra_libraries ${libpulse_LIBRARIES})
endif () endif ()
include_directories (${Unistring_INCLUDE_DIRS} include_directories (${Unistring_INCLUDE_DIRS}
${Ncursesw_INCLUDE_DIRS} ${Termo_INCLUDE_DIRS} ${curl_INCLUDE_DIRS} ${Ncursesw_INCLUDE_DIRS} ${Termo_INCLUDE_DIRS} ${curl_INCLUDE_DIRS}
${fftw_INCLUDE_DIRS}) ${fftw_INCLUDE_DIRS} ${libpulse_INCLUDE_DIRS})
link_directories (${curl_LIBRARY_DIRS} ${fftw_LIBRARY_DIRS}) link_directories (${curl_LIBRARY_DIRS}
${fftw_LIBRARY_DIRS} ${libpulse_LIBRARY_DIRS})
# Configuration # Configuration
if ("${CMAKE_SYSTEM_NAME}" MATCHES "BSD") if ("${CMAKE_SYSTEM_NAME}" MATCHES "BSD")
@@ -79,11 +90,25 @@ configure_file (${PROJECT_SOURCE_DIR}/config.h.in
${PROJECT_BINARY_DIR}/config.h) ${PROJECT_BINARY_DIR}/config.h)
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR}) include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
# Assuming a Unix-compatible system with a standalone preprocessor
set (actions_list ${PROJECT_SOURCE_DIR}/nncmpp.actions)
set (actions ${PROJECT_BINARY_DIR}/nncmpp-actions.h)
add_custom_command (OUTPUT ${actions}
COMMAND cpp -I${PROJECT_BINARY_DIR} -P ${actions_list}
| grep . | tr [[\n]] ^ | sed -ne [[h; s/,[^^]*/,/g]] -e [[s/$/COUNT/]]
-e [[s/[^^]*/\tACTION_&/g]] -e [[s/.*/enum action {\n&\n};\n/p]]
-e [[g; s/,[^^]*//g; y/_/-/]] -e [[s/[^^]\{1,\}/\t"&",/g]]
-e [[s/.*/static const char *g_action_names[] = {\n&};\n/p]]
-e [[g; s/[^^]*, *//g;]] -e [[s/[^^]\{1,\}/\t"&",/g]]
-e [[s/.*/static const char *g_action_descriptions[] = {\n&};/p]]
| tr ^ [[\n]] > ${actions}
COMMAND test -s ${actions}
DEPENDS ${actions_list} ${PROJECT_BINARY_DIR}/config.h VERBATIM)
# Build the main executable and link it # Build the main executable and link it
add_executable (${PROJECT_NAME} ${PROJECT_NAME}.c) add_executable (${PROJECT_NAME} ${PROJECT_NAME}.c ${actions})
target_link_libraries (${PROJECT_NAME} ${Unistring_LIBRARIES} target_link_libraries (${PROJECT_NAME} ${Unistring_LIBRARIES}
${Ncursesw_LIBRARIES} termo-static ${curl_LIBRARIES} ${Ncursesw_LIBRARIES} termo-static ${curl_LIBRARIES} ${extra_libraries})
${fftw_LIBRARIES} ${extra_libraries})
add_threads (${PROJECT_NAME}) add_threads (${PROJECT_NAME})
# Installation # Installation

11
NEWS
View File

@@ -1,3 +1,14 @@
1.2.0 (2021-12-21)
* Added ability to control the volume of MPD's current PulseAudio sink
* Now fetching Internet stream information asynchronously
* Added basic incremental search, normally bound to C-s, in all tabs
* Fixed jumping to the beginning of the queue after deleting items
1.1.1 (2021-11-04) 1.1.1 (2021-11-04)
* Terminal focus in/out events no longer ring the terminall bell * Terminal focus in/out events no longer ring the terminall bell

View File

@@ -11,9 +11,14 @@ names, and should be pronounced as "nincompoop".
Features Features
-------- --------
Most things are there. Enough for me to use it exclusively. Note that since I Most stuff is there. Enough for me to use the program exclusively. Among other
only use the filesystem browsing mode, that's also the only thing I care to things, it can display and change PulseAudio volume directly to cover the use
implement for the time being. case of remote control, it has a fast spectrum visualiser, and both
the appearance and key bindings can be customized.
Note that since I only use the filesystem browsing mode, that's also the only
thing I care to implement for the time being. Similarly, the search feature is
known to be clumsy.
image::nncmpp.png[align="center"] image::nncmpp.png[align="center"]
@@ -29,9 +34,10 @@ The rest of this README will concern itself with externalities.
Building Building
-------- --------
Build dependencies: CMake, pkg-config, asciidoctor, liberty (included), Build dependencies: CMake, pkg-config, asciidoctor,
termo (included) + liberty (included), termo (included) +
Runtime dependencies: ncursesw, libunistring, cURL, fftw3 (optional) Runtime dependencies: ncursesw, libunistring, cURL,
fftw3 (optional), libpulse (optional)
$ git clone --recursive https://git.janouch.name/p/nncmpp.git $ git clone --recursive https://git.janouch.name/p/nncmpp.git
$ mkdir nncmpp/build $ mkdir nncmpp/build

View File

@@ -1,11 +1,11 @@
#ifndef CONFIG_H #ifndef CONFIG_H
#define CONFIG_H #define CONFIG_H
#define PROGRAM_NAME "${CMAKE_PROJECT_NAME}" #define PROGRAM_NAME "${PROJECT_NAME}"
#define PROGRAM_VERSION "${PROJECT_VERSION}" #define PROGRAM_VERSION "${PROJECT_VERSION}"
#cmakedefine HAVE_RESIZETERM #cmakedefine HAVE_RESIZETERM
#cmakedefine WITH_FFTW #cmakedefine WITH_FFTW
#cmakedefine WITH_PULSE
#endif // ! CONFIG_H #endif /* ! CONFIG_H */

Submodule liberty updated: d71c47f8ce...7e8e085c97

72
nncmpp.actions Normal file
View File

@@ -0,0 +1,72 @@
#include "config.h"
NONE, Do nothing
QUIT, Quit
REDRAW, Redraw screen
TAB_HELP, Switch to help tab
TAB_LAST, Switch to last tab
TAB_PREVIOUS, Switch to previous tab
TAB_NEXT, Switch to next tab
MPD_TOGGLE, Toggle play/pause
MPD_STOP, Stop playback
MPD_PREVIOUS, Previous song
MPD_NEXT, Next song
MPD_BACKWARD, Seek backwards
MPD_FORWARD, Seek forwards
MPD_VOLUME_UP, Increase MPD volume
MPD_VOLUME_DOWN, Decrease MPD volume
MPD_SEARCH, Global search
MPD_ADD, Add selection to playlist
MPD_REPLACE, Replace playlist
MPD_REPEAT, Toggle repeat
MPD_RANDOM, Toggle random playback
MPD_SINGLE, Toggle single song playback
MPD_CONSUME, Toggle consume
MPD_UPDATE_DB, Update MPD database
MPD_COMMAND, Send raw command to MPD
#ifdef WITH_PULSE
PULSE_VOLUME_UP, Increase PulseAudio volume
PULSE_VOLUME_DOWN, Decrease PulseAudio volume
PULSE_MUTE, Toggle PulseAudio sink mute
#endif
CHOOSE, Choose item
DELETE, Delete item
UP, Go up a level
MULTISELECT, Toggle multiselect
INCREMENTAL_SEARCH, Incremental search
SCROLL_UP, Scroll up
SCROLL_DOWN, Scroll down
MOVE_UP, Move selection up
MOVE_DOWN, Move selection down
GOTO_TOP, Go to top
GOTO_BOTTOM, Go to bottom
GOTO_ITEM_PREVIOUS, Go to previous item
GOTO_ITEM_NEXT, Go to next item
GOTO_PAGE_PREVIOUS, Go to previous page
GOTO_PAGE_NEXT, Go to next page
GOTO_VIEW_TOP, Select top item
GOTO_VIEW_CENTER, Select center item
GOTO_VIEW_BOTTOM, Select bottom item
EDITOR_CONFIRM, Confirm input
EDITOR_B_CHAR, Go back a character
EDITOR_F_CHAR, Go forward a character
EDITOR_B_WORD, Go back a word
EDITOR_F_WORD, Go forward a word
EDITOR_HOME, Go to start of line
EDITOR_END, Go to end of line
EDITOR_B_DELETE, Delete last character
EDITOR_F_DELETE, Delete next character
EDITOR_B_KILL_WORD, Delete last word
EDITOR_B_KILL_LINE, Delete everything up to BOL
EDITOR_F_KILL_LINE, Delete everything up to EOL

View File

@@ -37,16 +37,17 @@ Options
Configuration Configuration
------------- -------------
Unless you run MPD on a remote machine, on an unusual port, or protected by Unless you run MPD on a remote machine, on an unusual port, protected by
a password, the client doesn't need a configuration file to work. It is, a password, or only accessible through a Unix socket, the client doesn't need
however, likely that you'll want to customize the looks or add some streams. a configuration file to work. It is, however, likely that you'll want to
You can start off with the following snippet: customize the looks or add some streams. You can start off with the following
snippet:
.... ....
settings = { settings = {
address = "localhost:6600" address = "~/.mpd/mpd.socket"
password = "<your password>" password = "<your password>"
root = "~/Music" pulseaudio = on
} }
colors = { colors = {
normal = "" normal = ""
@@ -96,6 +97,28 @@ settings = {
The sample rate should be greater than 40 kHz, the number of bits 8 or 16, The sample rate should be greater than 40 kHz, the number of bits 8 or 16,
and the number of channels doesn't matter, as they're simply averaged together. and the number of channels doesn't matter, as they're simply averaged together.
PulseAudio
----------
If you find standard MPD volume control useless, you may instead configure
*nncmpp* to show and control the volume of any PulseAudio sink MPD is currently
connected to.
This feature may be enabled with the *settings.pulseaudio* configuration option,
as in the snippet above. To replace the default volume control bindings, use:
....
normal = {
"M-PageUp" = "pulse-volume-up"
"M-PageDown" = "pulse-volume-down"
}
....
The respective actions may also be invoked from the help tab directly.
For this to work, *nncmpp* needs to access the right PulseAudio daemon--in case
your setup is unusual, consult the list of environment variables in
*pulseaudio*(1). MPD-compatibles are currently unsupported.
Files Files
----- -----
*nncmpp* follows the XDG Base Directory Specification. *nncmpp* follows the XDG Base Directory Specification.
@@ -110,4 +133,4 @@ or submit pull requests.
See also See also
-------- --------
*mpd*(1) *mpd*(1), *pulseaudio*(1)

711
nncmpp.c

File diff suppressed because it is too large Load Diff