diff --git a/src/kits/app/AppDefs.cpp b/src/kits/app/AppDefs.cpp index cf0a6b1835..a219fa076c 100644 --- a/src/kits/app/AppDefs.cpp +++ b/src/kits/app/AppDefs.cpp @@ -35,23 +35,3 @@ const uint8 B_I_BEAM_CURSOR[] = { 0xf, 0xc0, 0x7, 0x80, 0x3, 0x0, 0x3, 0x0, 0x3, 0x0, 0x3, 0x0, 0x3, 0x0, 0x3, 0x0, 0x3, 0x0, 0x3, 0x0, 0x3, 0x0, 0x3, 0x0, 0x3, 0x0, 0x3, 0x0, 0x7, 0x80, 0xf, 0xc0, }; - - -// ToDo: find a better home for these (what's wrong with libmedia.so?) -// ToDo: implement shutdown|launch_media_server() - -status_t -shutdown_media_server(bigtime_t timeout, - bool (*progress)(int stage, const char * message, void * cookie), - void * cookie) -{ - return B_OK; -} - - -status_t -launch_media_server(uint32 flags) -{ - return B_ERROR; -} - diff --git a/src/kits/media/MediaDefs.cpp b/src/kits/media/MediaDefs.cpp index e5d4ce9f15..df6bb6c7ef 100644 --- a/src/kits/media/MediaDefs.cpp +++ b/src/kits/media/MediaDefs.cpp @@ -1026,12 +1026,107 @@ struct buffer_clone_info *************************************************************/ -// shutdown_media_server() -// is provided by libbe.so and thus not implemented here +// shutdown_media_server() and launch_media_server() +// are provided by libbe.so in BeOS R5 + +status_t +shutdown_media_server(bigtime_t timeout, + bool (*progress)(int stage, const char * message, void * cookie), + void * cookie) +{ + BMessage msg(B_QUIT_REQUESTED); + BMessage reply; + status_t err; + + if ((err = msg.AddBool("be:_user_request", true)) != B_OK) + return err; + + if (be_roster->IsRunning(B_MEDIA_SERVER_SIGNATURE)) { + BMessenger messenger(B_MEDIA_SERVER_SIGNATURE); + progress(10, "Telling media_server to quit.", cookie); + + if ((err = messenger.SendMessage(&msg, &reply, 2000000, 2000000)) != B_OK) + return err; + + int32 rv; + if ((err = reply.FindInt32("error", &rv)) == B_OK && rv != B_OK) + return rv; + } + + if (be_roster->IsRunning(B_MEDIA_ADDON_SERVER_SIGNATURE)) { + BMessenger messenger(B_MEDIA_ADDON_SERVER_SIGNATURE); + progress(20, "Telling media_addon_server to quit.", cookie); + + if ((err = messenger.SendMessage(&msg, &reply, 2000000, 2000000)) != B_OK) + return err; + + int32 rv; + if ((err = reply.FindInt32("error", &rv)) == B_OK && rv != B_OK) + return rv; + } + + if (be_roster->IsRunning(B_MEDIA_SERVER_SIGNATURE)) { + progress(40, "Waiting for media_server to quit.", cookie); + snooze(200000); + } + + if (be_roster->IsRunning(B_MEDIA_ADDON_SERVER_SIGNATURE)) { + progress(50, "Waiting for media_addon_server to quit.", cookie); + snooze(200000); + } + + progress(70, "Cleaning Up.", cookie); + snooze(1000000); + + if (be_roster->IsRunning(B_MEDIA_SERVER_SIGNATURE)) { + kill_team(be_roster->TeamFor(B_MEDIA_SERVER_SIGNATURE)); + } + + if (be_roster->IsRunning(B_MEDIA_ADDON_SERVER_SIGNATURE)) { + kill_team(be_roster->TeamFor(B_MEDIA_ADDON_SERVER_SIGNATURE)); + } + + progress(100, "Done Shutting Down.", cookie); + snooze(1000000); + + return B_OK; +} -// launch_media_server() -// is provided by libbe.so and thus not implemented here +status_t +launch_media_server(uint32 flags) +{ + status_t err; + + if (be_roster->IsRunning(B_MEDIA_SERVER_SIGNATURE)) + return B_ALREADY_RUNNING; + + if (be_roster->IsRunning(B_MEDIA_ADDON_SERVER_SIGNATURE)) { + kill_team(be_roster->TeamFor(B_MEDIA_ADDON_SERVER_SIGNATURE)); + snooze(1000000); + } + + err = be_roster->Launch(B_MEDIA_SERVER_SIGNATURE); + if (err != B_OK) + return err; + + err = B_MEDIA_SYSTEM_FAILURE; + for (int i = 0; i < 15; i++) { + snooze(2000000); + + BMessage msg(1); // this is a hack + BMessage reply; + BMessenger messenger(B_MEDIA_ADDON_SERVER_SIGNATURE); + + if (messenger.IsValid()) { + messenger.SendMessage(&msg, &reply, 2000000, 2000000); + err = B_OK; + break; + } + } + + return err; +} /*************************************************************