I have tried to implement it on my own, but it seems I don't get your source code good enough :P
Here is the video showing an example of how it works, after pausing game sysmodule stops detecting if game is in focus because I guess thread exits in my implementation. :D That's why video ends there.
https://streamable.com/bmnzki
How to get if application is out of focus:
First we need to initialize pdmqry. As it has only 3 sessions free and we don't need active session for functions we use, we can clone service and close original one.
pdmqryInitialize();
Service* pdmqrySrv = pdmqryGetServiceSession();
Service pdmqryClone;
serviceClone(pdmqrySrv, &pdmqryClone);
serviceClose(pdmqrySrv);
memcpy(pdmqrySrv, &pdmqryClone, sizeof(Service));
For exiting standard pdmqryExit() will work.
Then there is this whole ass function to use
Result isApplicationOutOfFocus(u64 TIDnow, bool* outOfFocus) {
static s32 last_total_entries = 0;
static bool isOutOfFocus = false;
s32 total_entries = 0;
s32 start_entry_index = 0;
s32 end_entry_index = 0;
Result rc = pdmqryGetAvailablePlayEventRange(&total_entries, &start_entry_index, &end_entry_index);
if (R_FAILED(rc)) return rc;
if (total_entries == last_total_entries) {
*outOfFocus = isOutOfFocus;
return 0;
}
last_total_entries = total_entries;
#define EVENT_COUNT 16
PdmPlayEvent events[EVENT_COUNT];
s32 out = 0;
s32 start_entry = end_entry_index - (EVENT_COUNT-1);
if (start_entry < 0) start_entry = 0;
rc = pdmqryQueryPlayEvent(start_entry, events, EVENT_COUNT, &out);
if (R_FAILED(rc)) return rc;
if (out == 0) return 1;
int itr = -1;
for (int i = out-1; i >= 0; i--) {
PdmPlayEvent* event = &events[i];
if (event->play_event_type != PdmPlayEventType_Applet)
continue;
if (event->event_data.applet.applet_id != AppletId_application)
continue;
union {
uint32_t parts[2];
uint64_t full;
} TID;
TID.parts[0] = event->event_data.applet.program_id[1];
TID.parts[1] = event->event_data.applet.program_id[0];
if (TID.full != TIDnow && TID.full != (TIDnow & ~0xFFF)) //Retail games report always base titleid even when using different program
continue;
else {
itr = i;
break;
}
}
if (itr == -1) return 1;
bool isOut = events[itr].event_data.applet.event_type == PdmAppletEventType_OutOfFocus || events[itr].event_data.applet.event_type == PdmAppletEventType_OutOfFocus4;
*outOfFocus = isOut;
isOutOfFocus = isOut;
return 0;
}
It works well enough in my SaltyNX (i modified it to only detect retail games though), it's very fast and never had an issue with wrong detection.
I am sending this as I would really like for music to play even when game is paused.
I have tried to implement it on my own, but it seems I don't get your source code good enough :P
Here is the video showing an example of how it works, after pausing game sysmodule stops detecting if game is in focus because I guess thread exits in my implementation. :D That's why video ends there.
https://streamable.com/bmnzki
How to get if application is out of focus:
First we need to initialize pdmqry. As it has only 3 sessions free and we don't need active session for functions we use, we can clone service and close original one.
For exiting standard
pdmqryExit()will work.Then there is this whole ass function to use
It works well enough in my SaltyNX (i modified it to only detect retail games though), it's very fast and never had an issue with wrong detection.
I am sending this as I would really like for music to play even when game is paused.