Skip to content

Commit

Permalink
uses miniaudio decoder for wav, flac and mp3.
Browse files Browse the repository at this point in the history
  • Loading branch information
ravachol committed Nov 19, 2023
1 parent 1cde7b9 commit 7c9d496
Show file tree
Hide file tree
Showing 20 changed files with 3,217 additions and 1,429 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ LIBS = -lpthread -lrt -pthread -lm -lfreeimage -lglib-2.0 $(shell $(PKG_CONFIG)

OBJDIR = src/obj
PREFIX = /usr
SRCS = src/mpris.c src/playerops.c src/volume.c src/cutils.c src/soundgapless.c src/songloader.c src/file.c src/chafafunc.c src/cache.c src/metadata.c src/playlist.c src/stringfunc.c src/term.c src/settings.c src/player.c src/albumart.c src/visuals.c src/kew.c
SRCS = src/soundcommon.c src/soundbuiltin.c src/soundpcm.c src/mpris.c src/playerops.c src/volume.c src/cutils.c src/soundgapless.c src/songloader.c src/file.c src/chafafunc.c src/cache.c src/metadata.c src/playlist.c src/stringfunc.c src/term.c src/settings.c src/player.c src/albumart.c src/visuals.c src/kew.c
OBJS = $(SRCS:src/%.c=$(OBJDIR)/%.o)

MAN_PAGE = kew.1
Expand Down
7 changes: 2 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
[![Debian package](https://img.shields.io/debian/v/kew/sid?color=red&label=debian&logo=debian&style=for-the-badge)](https://packages.debian.org/sid/kew)
[![GitHub license](https://img.shields.io/github/license/ravachol/kew?color=333333&style=for-the-badge)](https://github.com/ravachol/kew/blob/master/LICENSE)



Listen to music in the terminal.

<div align="center">
Expand All @@ -14,15 +12,14 @@ Listen to music in the terminal.

kew (/kjuː/) is a command-line music player for Linux.



## Features

* Search a music library with partial titles.
* Creates a playlist based on a matched directory.
* Display album covers as ASCII art or as a normal image.
* Control the player with previous, next and pause.
* Has gapless playback and supports 24-bit audio.
* Has gapless playback (between files of the same format and type) and supports 24-bit audio.
* Does not yet work well with very long audio files that are not mp3, wav or flac.

## Name Change

Expand Down
2,816 changes: 1,911 additions & 905 deletions include/miniaudio/miniaudio.h

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ int removeDirectory(const char *path)

int deleteFile(const char *filePath)
{
if (unlink(filePath) == 0)
if (remove(filePath) == 0)
{
return 0;
}
Expand Down
16 changes: 10 additions & 6 deletions src/kew.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
#include "volume.h"
#include "playerops.h"
#include "mpris.h"
#include "soundcommon.h"

// #define DEBUG 1
#define MAX_SEQ_LEN 1024 // Maximum length of sequence buffer
Expand Down Expand Up @@ -299,7 +300,7 @@ void prepareNextSong()
if (loadingFailed)
return;

if (!skipPrev && !gotoSong && !repeatEnabled)
if (!skipPrev && !gotoSong && !isRepeatEnabled())
{
if (nextSong != NULL)
currentSong = nextSong;
Expand Down Expand Up @@ -333,7 +334,7 @@ void prepareNextSong()

refresh = true;

if (!repeatEnabled)
if (!isRepeatEnabled())
{
pthread_mutex_lock(&(loadingdata.mutex));
if (usingSongDataA &&
Expand Down Expand Up @@ -616,12 +617,14 @@ gboolean mainloop_callback(gpointer data)
loadAudioData();

if (songHasErrors)
tryLoadNext();
tryLoadNext();

if (isPlaybackDone())
{
{
updateLastSongSwitchTime();
prepareNextSong();
prepareNextSong();
if (!doQuit)
switchAudioImplementation();
}

if (doQuit || loadingFailed)
Expand Down Expand Up @@ -673,6 +676,7 @@ void play(Node *song)
void cleanupOnExit()
{
cleanupPlaybackDevice();
cleanupAudioContext();
emitPlaybackStoppedMpris();
unloadSongData(&loadingdata.songdataA);
unloadSongData(&loadingdata.songdataB);
Expand All @@ -692,7 +696,7 @@ void cleanupOnExit()
showCursor();

#ifdef DEBUG
fclose(logFile);
fclose(logFile);
#endif
freopen("/dev/stderr", "w", stderr);
}
Expand Down
2 changes: 1 addition & 1 deletion src/mpris.c
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ static gboolean get_shuffle(GDBusConnection *connection, const gchar *sender,
const gchar *property_name, GVariant **value,
GError **error, gpointer user_data)
{
*value = g_variant_new_boolean(shuffleEnabled ? TRUE : FALSE);
*value = g_variant_new_boolean(isShuffleEnabled() ? TRUE : FALSE);
return TRUE;
}

Expand Down
10 changes: 3 additions & 7 deletions src/player.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ typedef struct
} PixelData;
#endif

const char VERSION[] = "1.5.2";
const char VERSION[] = "1.6.0";
const int LOGO_COLOR = 3;
const int VERSION_COLOR = 6;
const int ABSOLUTE_MIN_WIDTH = 38;
Expand Down Expand Up @@ -299,10 +299,6 @@ void printBasicMetadata(TagSettings const *metadata)
printf("\e[1m\e[39m");

printWithDelay(metadata->title, 9, maxWidth - 2);

// Alternative (no delay):
// printf("\033[1K\r %.*s", maxWidth, metadata->title);
// printf("\n");
}
cursorJumpDown(rows - 1);
}
Expand Down Expand Up @@ -433,13 +429,13 @@ void printLastRow()

char text[100] = " [F2 Playlist] [F3 Keys] [Q Quit]";

if (repeatEnabled)
if (isRepeatEnabled())
{
char repeatText[] = " R";
strcat(text, repeatText);
}

if (shuffleEnabled)
if (isShuffleEnabled())
{
char shuffleText[] = " S";
strcat(text, shuffleText);
Expand Down
24 changes: 15 additions & 9 deletions src/playerops.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ void updateLastInputTime()

void emitStringPropertyChanged(const gchar *propertyName, const gchar *newValue)
{

GVariantBuilder changed_properties_builder;
g_variant_builder_init(&changed_properties_builder, G_VARIANT_TYPE("a{sv}"));
g_variant_builder_add(&changed_properties_builder, "{sv}", propertyName, g_variant_new_string(newValue));
Expand Down Expand Up @@ -154,7 +153,10 @@ void togglePause(double *totalPauseSeconds, double *pauseSeconds, struct timespe

void toggleRepeat()
{
repeatEnabled = !repeatEnabled;

bool repeatEnabled = !isRepeatEnabled();
setRepeatEnabled(repeatEnabled);

if (repeatEnabled)
{
emitStringPropertyChanged("LoopStatus", "Track");
Expand All @@ -180,7 +182,8 @@ void addToPlaylist()

void toggleShuffle()
{
shuffleEnabled = !shuffleEnabled;
bool shuffleEnabled = !isShuffleEnabled();
setShuffleEnabled(shuffleEnabled);

if (shuffleEnabled)
{
Expand Down Expand Up @@ -254,7 +257,7 @@ void calcElapsedTime()
{
elapsedSeconds = (double)(current_time.tv_sec - start_time.tv_sec) +
(double)(current_time.tv_nsec - start_time.tv_nsec) / 1e9;
elapsedSeconds += seekElapsed + seekAccumulatedSeconds;
elapsedSeconds += getSeekElapsed() + seekAccumulatedSeconds;
elapsedSeconds -= totalPauseSeconds;
if (elapsedSeconds > duration)
elapsedSeconds = duration;
Expand All @@ -272,17 +275,17 @@ void flushSeek()
{
if (seekAccumulatedSeconds != 0.0)
{
seekElapsed += seekAccumulatedSeconds;
setSeekElapsed(getSeekElapsed() + seekAccumulatedSeconds);
seekAccumulatedSeconds = 0.0;
calcElapsedTime();
float percentage = elapsedSeconds / (float)duration * 100.0;
float percentage = elapsedSeconds / (float)duration * 100.0;

if (percentage < 0.0)
{
seekElapsed = 0.0;
setSeekElapsed(0.0);
percentage = 0.0;
}

seekPercentage(percentage);
}
}
Expand Down Expand Up @@ -333,6 +336,8 @@ void assignLoadedData()
{
userData.filenameB = loadingdata.songdataB->pcmFilePath;
userData.songdataB = loadingdata.songdataB;
if (hasBuiltinDecoder(loadingdata.songdataB->filePath))
prepareNextDecoder(loadingdata.songdataB->filePath);
}
else
userData.filenameB = NULL;
Expand All @@ -343,6 +348,8 @@ void assignLoadedData()
{
userData.filenameA = loadingdata.songdataA->pcmFilePath;
userData.songdataA = loadingdata.songdataA;
if (hasBuiltinDecoder(loadingdata.songdataA->filePath))
prepareNextDecoder(loadingdata.songdataA->filePath);
}
else
userData.filenameA = NULL;
Expand Down Expand Up @@ -516,7 +523,6 @@ void skipToNumberedSong(int songNumber)
forceSkip = true;
if (songNumber < playlist.count)
skipToNumberedSong(songNumber + 1);

}

updateLastSongSwitchTime();
Expand Down
2 changes: 1 addition & 1 deletion src/settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ AppSettings constructAppSettings(KeyValuePair *pairs, int count)
strncpy(settings.coverEnabled, "1", sizeof(settings.coverEnabled));
strncpy(settings.coverAnsi, "0", sizeof(settings.coverAnsi));
strncpy(settings.visualizerEnabled, "1", sizeof(settings.visualizerEnabled));
strncpy(settings.useProfileColors, "0", sizeof(settings.useProfileColors));
strncpy(settings.useProfileColors, "1", sizeof(settings.useProfileColors));

strncpy(settings.volumeUp, "+", sizeof(settings.volumeUp));
strncpy(settings.volumeDown, "-", sizeof(settings.volumeDown));
Expand Down
14 changes: 9 additions & 5 deletions src/songloader.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ void *child_cleanup(void *arg)
int status;
waitpid(data->pid, &status, 0);
ffmpegPids[data->index] = -1;
numRunningProcesses--;
numRunningProcesses--;
free(arg);
return NULL;
}
Expand Down Expand Up @@ -72,7 +72,7 @@ void stopFFmpeg()
}
}

int convertToPcmFile(const char *filePath, const char *outputFilePath)
int convertToPcmFile(SongData* songData, const char *filePath, const char *outputFilePath)
{
char command[COMMAND_SIZE];

Expand Down Expand Up @@ -253,7 +253,7 @@ int loadPcmAudio(SongData *songdata)
return -1;

generateTempFilePath(songdata->filePath, songdata->pcmFilePath, "temp", ".pcm");
convertToPcmFile(songdata->filePath, songdata->pcmFilePath);
convertToPcmFile(songdata, songdata->filePath, songdata->pcmFilePath);
int count = 0;
int result = -1;
while (result < 1 && count < maxSleepTimes)
Expand Down Expand Up @@ -306,7 +306,8 @@ SongData *loadSongData(char *filePath)
c_sleep(10);
loadDuration(songdata);
c_sleep(10);
loadPcmAudio(songdata);
if (!hasBuiltinDecoder(songdata->filePath))
loadPcmAudio(songdata);
songdata->deleted = false;
return songdata;
}
Expand Down Expand Up @@ -341,8 +342,11 @@ void unloadSongData(SongData **songdata)
data->trackId = NULL;

if (existsFile(data->pcmFilePath) > -1)
{
while (numRunningProcesses > 0)
c_sleep(100);
deleteFile(data->pcmFilePath);

}
if (data->pcmFile != NULL)
free(data->pcmFile);

Expand Down
1 change: 1 addition & 0 deletions src/songloader.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "chafafunc.h"
#include "albumart.h"
#include "soundgapless.h"
#include "soundcommon.h"

#ifndef KEYVALUEPAIR_STRUCT
#define KEYVALUEPAIR_STRUCT
Expand Down
Loading

0 comments on commit 7c9d496

Please sign in to comment.