201 lines
4.2 KiB
C++
201 lines
4.2 KiB
C++
|
/*
|
||
|
* sounds ThemesAddon class
|
||
|
*/
|
||
|
|
||
|
#include <Alert.h>
|
||
|
#include <Application.h>
|
||
|
#include <Directory.h>
|
||
|
#include <Entry.h>
|
||
|
#include <MediaFiles.h>
|
||
|
#include <Message.h>
|
||
|
#include <Messenger.h>
|
||
|
#include <Path.h>
|
||
|
#include <Roster.h>
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#include "ThemesAddon.h"
|
||
|
#include "UITheme.h"
|
||
|
|
||
|
#ifdef SINGLE_BINARY
|
||
|
#define instanciate_themes_addon instanciate_themes_addon_sounds
|
||
|
#endif
|
||
|
|
||
|
#define A_NAME "Sounds"
|
||
|
#define A_MSGNAME Z_THEME_SOUNDS_SETTINGS
|
||
|
#define A_DESCRIPTION "System sound events"
|
||
|
|
||
|
class SoundsThemesAddon : public ThemesAddon {
|
||
|
public:
|
||
|
SoundsThemesAddon();
|
||
|
~SoundsThemesAddon();
|
||
|
|
||
|
const char *Description();
|
||
|
|
||
|
status_t RunPreferencesPanel();
|
||
|
|
||
|
status_t AddNames(BMessage &names);
|
||
|
|
||
|
status_t ApplyTheme(BMessage &theme, uint32 flags=0L);
|
||
|
status_t MakeTheme(BMessage &theme, uint32 flags=0L);
|
||
|
|
||
|
status_t ApplyDefaultTheme(uint32 flags=0L);
|
||
|
};
|
||
|
|
||
|
SoundsThemesAddon::SoundsThemesAddon()
|
||
|
: ThemesAddon(A_NAME, A_MSGNAME)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
SoundsThemesAddon::~SoundsThemesAddon()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
const char *SoundsThemesAddon::Description()
|
||
|
{
|
||
|
return A_DESCRIPTION;
|
||
|
}
|
||
|
|
||
|
status_t SoundsThemesAddon::RunPreferencesPanel()
|
||
|
{
|
||
|
status_t err;
|
||
|
entry_ref ref;
|
||
|
BEntry ent;
|
||
|
err = ent.SetTo("/boot/beos/preferences/Sounds");
|
||
|
if (!err) {
|
||
|
err = ent.GetRef(&ref);
|
||
|
if (!err) {
|
||
|
err = be_roster->Launch(&ref);
|
||
|
}
|
||
|
}
|
||
|
if (!err)
|
||
|
return B_OK;
|
||
|
err = ent.SetTo("/system/add-ons/Preferences/Sounds");
|
||
|
if (!err) {
|
||
|
err = ent.GetRef(&ref);
|
||
|
if (!err) {
|
||
|
err = be_roster->Launch(&ref);
|
||
|
if (err) {
|
||
|
BMessage msg(B_REFS_RECEIVED);
|
||
|
msg.AddRef("refs", &ref);
|
||
|
be_app_messenger.SendMessage(&msg);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
status_t SoundsThemesAddon::AddNames(BMessage &names)
|
||
|
{
|
||
|
names.AddString(Z_THEME_SOUNDS_SETTINGS, "Sounds Settings");
|
||
|
names.AddString("sounds:file", "Filename for this sound event");
|
||
|
names.AddString("sounds:volume", "Volume for this sound event");
|
||
|
return B_OK;
|
||
|
}
|
||
|
|
||
|
status_t SoundsThemesAddon::ApplyTheme(BMessage &theme, uint32 flags)
|
||
|
{
|
||
|
BMessage sounds;
|
||
|
status_t err;
|
||
|
BMediaFiles bmfs;
|
||
|
BString item;
|
||
|
entry_ref entry;
|
||
|
BEntry ent;
|
||
|
BPath path;
|
||
|
const char *p;
|
||
|
float gain;
|
||
|
void *cookie = NULL;
|
||
|
const char *field_name;
|
||
|
type_code field_code;
|
||
|
int32 field_count;
|
||
|
BMessage msg;
|
||
|
|
||
|
(void)flags;
|
||
|
err = MyMessage(theme, sounds);
|
||
|
if (err)
|
||
|
return err;
|
||
|
|
||
|
bmfs.RewindRefs(BMediaFiles::B_SOUNDS);
|
||
|
while (sounds.GetNextName(&cookie,
|
||
|
&field_name,
|
||
|
&field_code,
|
||
|
&field_count) == B_OK) {
|
||
|
if (field_code != B_MESSAGE_TYPE)
|
||
|
continue;
|
||
|
if (sounds.FindMessage(field_name, &msg) < B_OK)
|
||
|
continue;
|
||
|
/* remove old ref if any */
|
||
|
if ((bmfs.GetRefFor(BMediaFiles::B_SOUNDS, field_name, &entry) >= B_OK)
|
||
|
&& (entry.device >= 0))
|
||
|
bmfs.RemoveRefFor(BMediaFiles::B_SOUNDS, field_name, entry);
|
||
|
if (msg.FindString("sounds:file", &p) < B_OK)
|
||
|
continue;
|
||
|
path.SetTo(p);
|
||
|
if (ent.SetTo(path.Path()) < B_OK)
|
||
|
continue;
|
||
|
if (ent.GetRef(&entry) < B_OK)
|
||
|
continue;
|
||
|
if (bmfs.SetRefFor(BMediaFiles::B_SOUNDS, field_name, entry) < B_OK)
|
||
|
continue;
|
||
|
if (msg.FindFloat("sounds:volume", &gain) < B_OK)
|
||
|
continue;
|
||
|
if (bmfs.SetAudioGainFor(BMediaFiles::B_SOUNDS, field_name, gain) < B_OK)
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
return B_OK;
|
||
|
}
|
||
|
|
||
|
status_t SoundsThemesAddon::MakeTheme(BMessage &theme, uint32 flags)
|
||
|
{
|
||
|
BMessage sounds;
|
||
|
status_t err;
|
||
|
BMediaFiles bmfs;
|
||
|
BString item;
|
||
|
entry_ref entry;
|
||
|
BEntry ent;
|
||
|
BPath path;
|
||
|
float gain;
|
||
|
|
||
|
(void)flags;
|
||
|
err = MyMessage(theme, sounds);
|
||
|
if (err)
|
||
|
sounds.MakeEmpty();
|
||
|
|
||
|
bmfs.RewindRefs(BMediaFiles::B_SOUNDS);
|
||
|
while (bmfs.GetNextRef(&item, &entry) == B_OK) {
|
||
|
BMessage msg('SndI');
|
||
|
path.Unset();
|
||
|
ent.SetTo(&entry);
|
||
|
ent.GetPath(&path);
|
||
|
//printf("\t%s: %s\n", item.String(), path.Path());
|
||
|
if (path.Path()) {
|
||
|
msg.AddString("sounds:file", path.Path());
|
||
|
if (bmfs.GetAudioGainFor(BMediaFiles::B_SOUNDS, item.String(), &gain) >= B_OK)
|
||
|
msg.AddFloat("sounds:volume", gain);
|
||
|
}
|
||
|
sounds.AddMessage(item.String(), &msg);
|
||
|
}
|
||
|
|
||
|
err = SetMyMessage(theme, sounds);
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
status_t SoundsThemesAddon::ApplyDefaultTheme(uint32 flags)
|
||
|
{
|
||
|
BMessage theme;
|
||
|
BMessage sounds;
|
||
|
(void)flags;
|
||
|
//theme.AddMessage(A_MSGNAME, &deskbar);
|
||
|
//return ApplyTheme(theme, flags);
|
||
|
// TODO
|
||
|
return B_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
ThemesAddon *instanciate_themes_addon()
|
||
|
{
|
||
|
return (ThemesAddon *) new SoundsThemesAddon;
|
||
|
}
|