diff --git a/include/np.h b/include/np.h index f50d44c..162b114 100644 --- a/include/np.h +++ b/include/np.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include void np_init(); @@ -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; @@ -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 @@ -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 }; diff --git a/np/main.c b/np/main.c index 86ce740..60c7f62 100644 --- a/np/main.c +++ b/np/main.c @@ -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); } @@ -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); } diff --git a/np_windows.c b/np_windows.c index 1c367f5..8d4a9aa 100644 --- a/np_windows.c +++ b/np_windows.c @@ -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, @@ -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));