diff --git a/headers/private/media/DataExchange.h b/headers/private/media/DataExchange.h index 3e76a148ae..6f66a20809 100644 --- a/headers/private/media/DataExchange.h +++ b/headers/private/media/DataExchange.h @@ -74,6 +74,8 @@ enum { MEDIA_SERVER_GET_FORMATS, MEDIA_SERVER_MAKE_FORMAT_FOR, + + MEDIA_SERVER_SYSTEM_BEEP_EVENT }; // Raw port based communication @@ -1012,4 +1014,10 @@ struct controllable_set_parameter_data_reply : public reply_data { }; + + +enum { + SYSTEM_BEEP_EVENT_INVOKE = 1, + SYSTEM_BEEP_EVENT_ADD +}; #endif // _DATA_EXCHANGE_H diff --git a/src/kits/support/Beep.cpp b/src/kits/support/Beep.cpp index 6887d65db5..d372531e2c 100644 --- a/src/kits/support/Beep.cpp +++ b/src/kits/support/Beep.cpp @@ -7,13 +7,24 @@ #include #include +#include "DataExchange.h" + status_t system_beep(const char *eventName) { - printf("beep event \"%s\" requested.\n", eventName); - // ToDo: ask media server to beep around - return B_ERROR; + BMessenger messenger("application/x-vnd.Be.media-server"); + if (!messenger.IsValid()) + return B_ERROR; + BMessage msg(MEDIA_SERVER_SYSTEM_BEEP_EVENT), reply; + msg.AddInt32("action", SYSTEM_BEEP_EVENT_INVOKE); + msg.AddString("event", eventName); + + status_t err = messenger.SendMessage(&msg, &reply); + if ((err != B_OK) + || (reply.FindInt32("error", &err) != B_OK)) + err = B_BAD_REPLY; + return err; } @@ -27,7 +38,18 @@ beep() status_t add_system_beep_event(const char *eventName, uint32 flags) { - // ToDo: ask media server to add beep event - return B_ERROR; + BMessenger messenger("application/x-vnd.Be.media-server"); + if (!messenger.IsValid()) + return B_ERROR; + BMessage msg(MEDIA_SERVER_SYSTEM_BEEP_EVENT), reply; + msg.AddInt32("action", SYSTEM_BEEP_EVENT_ADD); + msg.AddString("event", eventName); + msg.AddInt32("flags", flags); + + status_t err = messenger.SendMessage(&msg, &reply); + if ((err != B_OK) + || (reply.FindInt32("error", &err) != B_OK)) + err = B_BAD_REPLY; + return err; } diff --git a/src/kits/support/Jamfile b/src/kits/support/Jamfile index 5a8d6f9a10..918032363b 100644 --- a/src/kits/support/Jamfile +++ b/src/kits/support/Jamfile @@ -8,7 +8,7 @@ SetSubDirSupportedPlatforms haiku libbe_test ; # # addr_t. #} -UsePrivateHeaders shared app ; +UsePrivateHeaders shared app media ; MergeObject support_kit.o : Archivable.cpp diff --git a/src/servers/media/MMediaFilesManager.cpp b/src/servers/media/MMediaFilesManager.cpp index 5ca16f30fb..a3c6d4c585 100644 --- a/src/servers/media/MMediaFilesManager.cpp +++ b/src/servers/media/MMediaFilesManager.cpp @@ -4,6 +4,7 @@ */ #include #include +#include #include #include #include @@ -363,3 +364,37 @@ MMediaFilesManager::TimerMessage() fRunner = NULL; } + +void +MMediaFilesManager::HandleSystemBeepEvent(BMessage *msg) +{ + int32 action, flags; + BString event; + status_t err = B_OK; + if ((msg->FindString("event", &event) != B_OK) + || (msg->FindInt32("action", &action) != B_OK)) { + err = B_BAD_VALUE; + } + + if (action == SYSTEM_BEEP_EVENT_ADD) { + if (msg->FindInt32("flags", &flags) != B_OK) + err = B_BAD_VALUE; + } + + if (err != B_OK) { + msg->SendReply(err); + return; + } + + switch (action) { + case SYSTEM_BEEP_EVENT_ADD: { + entry_ref ref; + SetRefFor(BMediaFiles::B_SOUNDS, event.String(), ref); + break; + } + case SYSTEM_BEEP_EVENT_INVOKE: { + // TODO play the sound + } + } +} + diff --git a/src/servers/media/MMediaFilesManager.h b/src/servers/media/MMediaFilesManager.h index 3fa294fc5b..26baec81fc 100644 --- a/src/servers/media/MMediaFilesManager.h +++ b/src/servers/media/MMediaFilesManager.h @@ -51,6 +51,8 @@ class MMediaFilesManager void TimerMessage(); + void HandleSystemBeepEvent(BMessage *msg); + private: static int32 ReadPascalString(BFile &file, char **str); static int32 WritePascalString(BFile &file, const char *str); diff --git a/src/servers/media/media_server.cpp b/src/servers/media/media_server.cpp index f9e83d1600..2b937cf221 100644 --- a/src/servers/media/media_server.cpp +++ b/src/servers/media/media_server.cpp @@ -802,7 +802,10 @@ ServerApp::MessageReceived(BMessage *msg) case MEDIA_SERVER_MAKE_FORMAT_FOR: gFormatManager->MakeFormatFor(*msg); break; - + + case MEDIA_SERVER_SYSTEM_BEEP_EVENT: + gMMediaFilesManager->HandleSystemBeepEvent(msg); + break; default: inherited::MessageReceived(msg); printf("\nmedia_server: unknown message received:\n");