Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion include/np.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once
#include <stdint.h>
#include <stdio.h>
#include <time.h>

void np_init();
Expand All @@ -13,6 +14,16 @@ enum np_playback_type {
np_playback_type_image,
};

enum np_playback_status_type {
np_playbackStatus_type_unknown,
np_playbackStatus_type_closed,
np_playbackStatus_type_opened,
np_playbackStatus_type_changing,
np_playbackStatus_type_stopped,
np_playbackStatus_type_playing,
np_playbackStatus_type_paused,
};

struct np_info {
char **album_artists;
size_t album_artists_size;
Expand All @@ -33,7 +44,6 @@ struct np_info {
char *created; // linux only
char *first_played; // linux only
char *last_played; // linux only

char *album;
int album_track_count; // windows only
char *art_url; // linux only
Expand All @@ -46,6 +56,12 @@ struct np_info {
int track_number;
char *url; // linux only

int position; // windows only
int start_time; // windows only
int end_time; // windows only
int last_updated; // windows only

enum np_playback_status_type playback_status; // windows only
enum np_playback_type playback_type; // windows only
};

Expand Down
31 changes: 31 additions & 0 deletions np/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,15 @@ int main() {
if (info->track_number) {
printf("Track Number: %d\n", info->track_number);
}
if (info->start_time) {
printf("Start Time: %d\n", info->start_time);
}
if (info->end_time) {
printf("End Time: %d\n", info->end_time);
}
if (info->position) {
printf("Position: %d\n", info->position);
}
if (info->url) {
printf("URL: %s\n", info->url);
}
Expand All @@ -77,6 +86,28 @@ int main() {
default:
break;
}
switch (info->playback_status) {
case np_playbackStatus_type_closed:
printf("Status: Closed\n");
break;
case np_playbackStatus_type_opened:
printf("Status: Opened\n");
break;
case np_playbackStatus_type_changing:
printf("Status: Changing\n");
break;
case np_playbackStatus_type_stopped:
printf("Status: Stopped\n");
break;
case np_playbackStatus_type_playing:
printf("Status: Playing\n");
break;
case np_playbackStatus_type_paused:
printf("Status: Paused\n");
break;
default:
break;
}

np_info_destroy(info);
}
Expand Down
57 changes: 57 additions & 0 deletions np_windows.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,16 @@ struct np_info *np_info_get() {
goto exit4;
}

__x_ABI_CWindows_CMedia_CControl_CIGlobalSystemMediaTransportControlsSessionTimelineProperties *timeline;
if (FAILED(session->lpVtbl->GetTimelineProperties(session, &timeline)) || !timeline) {
goto exit4;
}

__x_ABI_CWindows_CMedia_CControl_CIGlobalSystemMediaTransportControlsSessionPlaybackInfo *playback_info;
if (FAILED(session->lpVtbl->GetPlaybackInfo(session, &playback_info)) || !playback_info) {
goto exit4;
}

struct async_handler info_async = {
.vtable = &async_handler_vtable,
.iid = &info_async_iid,
Expand All @@ -146,6 +156,53 @@ struct np_info *np_info_get() {

r = calloc(1, sizeof(struct np_info));

__x_ABI_CWindows_CFoundation_CTimeSpan position;
if (SUCCEEDED(timeline->lpVtbl->get_Position(timeline, &position))) {
r->position = position.Duration;
}

__x_ABI_CWindows_CFoundation_CTimeSpan start_time;
if (SUCCEEDED(timeline->lpVtbl->get_StartTime(timeline, &start_time))) {
r->start_time = start_time.Duration;
}

__x_ABI_CWindows_CFoundation_CTimeSpan end_time;
if (SUCCEEDED(timeline->lpVtbl->get_EndTime(timeline, &end_time))) {
r->end_time = end_time.Duration;
}

__x_ABI_CWindows_CFoundation_CDateTime last_updated;
if (SUCCEEDED(timeline->lpVtbl->get_LastUpdatedTime(timeline, &last_updated))) {
r->last_updated = last_updated.UniversalTime;
}

__x_ABI_CWindows_CMedia_CControl_CGlobalSystemMediaTransportControlsSessionPlaybackStatus playback_status;
if (SUCCEEDED(playback_info->lpVtbl->get_PlaybackStatus(playback_info, &playback_status))) {
switch (playback_status) {
case GlobalSystemMediaTransportControlsSessionPlaybackStatus_Closed:
r->playback_status = np_playbackStatus_type_closed;
break;
case GlobalSystemMediaTransportControlsSessionPlaybackStatus_Opened:
r->playback_status = np_playbackStatus_type_opened;
break;
case GlobalSystemMediaTransportControlsSessionPlaybackStatus_Changing:
r->playback_status = np_playbackStatus_type_changing;
break;
case GlobalSystemMediaTransportControlsSessionPlaybackStatus_Stopped:
r->playback_status = np_playbackStatus_type_stopped;
break;
case GlobalSystemMediaTransportControlsSessionPlaybackStatus_Playing:
r->playback_status = np_playbackStatus_type_playing;
break;
case GlobalSystemMediaTransportControlsSessionPlaybackStatus_Paused:
r->playback_status = np_playbackStatus_type_paused;
break;
default:
r->playback_status = np_playbackStatus_type_unknown;
break;
}
}

HSTRING album_artist;
if (SUCCEEDED(info->lpVtbl->get_AlbumArtist(info, &album_artist)) && album_artist) {
r->album_artists = calloc(1, sizeof(*r->album_artists));
Expand Down