Esempio n. 1
0
void
VolumeControl::AttachedToWindow()
{
	BSlider::AttachedToWindow();

	if (_IsReplicant())
		SetEventMask(0, 0);
	else
		SetEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY);

	be_roster->StartWatching(this, B_REQUEST_LAUNCHED | B_REQUEST_QUIT);

	_ConnectVolume();

	if (!fMixerControl->Connected()) {
		// Wait a bit, and try again - the media server might not have been
		// ready yet
		BMessage reconnect(kMsgReconnectVolume);
		BMessageRunner::StartSending(this, &reconnect, 1000000LL, 1);
		fConnectRetries = 3;
	}
}
Esempio n. 2
0
void
VolumeControl::MessageReceived(BMessage* msg)
{
	switch (msg->what) {
		case B_MOUSE_WHEEL_CHANGED:
		{
			if (!fMixerControl->Connected())
				return;

			// Even though the volume bar is horizontal, we use the more common
			// vertical mouse wheel change
			float deltaY = 0.0f;

			msg->FindFloat("be:wheel_delta_y", &deltaY);

			if (deltaY == 0.0f)
				return;

			int32 currentValue = Value();
			int32 newValue = currentValue - int32(deltaY) * 3;

			if (newValue != currentValue) {
				SetValue(newValue);
				InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED);
			}
			break;
		}

		case B_MEDIA_NEW_PARAMETER_VALUE:
			if (IsTracking())
				break;

			SetValue((int32)fMixerControl->Volume());
			break;

		case B_SOME_APP_LAUNCHED:
		case B_SOME_APP_QUIT:
		{
			const char* signature;
			if (msg->FindString("be:signature", &signature) != B_OK)
				break;

			bool isMediaServer = !strcmp(signature, kMediaServerSignature);
			bool isAddOnServer = !strcmp(signature, kAddOnServerSignature);
			if (!isMediaServer && !isAddOnServer)
				break;

			if (isMediaServer)
				fMediaServerRunning = msg->what == B_SOME_APP_LAUNCHED;
			if (isAddOnServer)
				fAddOnServerRunning = msg->what == B_SOME_APP_LAUNCHED;

			if (!fMediaServerRunning && !fAddOnServerRunning) {
				// No media server around
				SetLabel(B_TRANSLATE("No media server running"));
				SetEnabled(false);
			} else if (fMediaServerRunning && fAddOnServerRunning) {
				// HACK!
				// quit our now invalid instance of the media roster
				// so that before new nodes are created,
				// we get a new roster
				BMediaRoster* roster = BMediaRoster::CurrentRoster();
				if (roster != NULL) {
					roster->Lock();
					roster->Quit();
				}

				BMessage reconnect(kMsgReconnectVolume);
				BMessageRunner::StartSending(this, &reconnect, 1000000LL, 1);
				fConnectRetries = 3;
			}
			break;
		}

		case B_QUIT_REQUESTED:
			Window()->MessageReceived(msg);
			break;

		case kMsgReconnectVolume:
			_ConnectVolume();
			if (!fMixerControl->Connected() && --fConnectRetries > 1) {
				BMessage reconnect(kMsgReconnectVolume);
				BMessageRunner::StartSending(this, &reconnect,
					6000000LL / fConnectRetries, 1);
			}
			break;

		default:
			return BView::MessageReceived(msg);
	}
}
Esempio n. 3
0
void
VolumeControl::MessageReceived(BMessage* msg)
{
	switch (msg->what) {
		case B_MOUSE_WHEEL_CHANGED:
		{
			if (!fMixerControl->Connected())
				return;

			// Even though the volume bar is horizontal, we use the more common
			// vertical mouse wheel change
			float deltaY = 0.0f;

			msg->FindFloat("be:wheel_delta_y", &deltaY);

			if (deltaY == 0.0f)
				return;

			int32 currentValue = Value();
			int32 newValue = currentValue - int32(deltaY) * 3;

			if (newValue != currentValue) {
				SetValue(newValue);
				InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED);
			}
			break;
		}

		case B_MEDIA_NEW_PARAMETER_VALUE:
			if (IsTracking())
				break;

			SetValue((int32)fMixerControl->Volume());
			break;

		case B_MEDIA_SERVER_STARTED:
		{
			BMessage reconnect(kMsgReconnectVolume);
			BMessageRunner::StartSending(this, &reconnect, 1000000LL, 1);
			fConnectRetries = 3;
			break;
		}

		case B_MEDIA_SERVER_QUIT:
		{
			// No media server around
			SetLabel(B_TRANSLATE("No media server running"));
			SetEnabled(false);
			break;
		}

		case B_QUIT_REQUESTED:
			Window()->MessageReceived(msg);
			break;

		case kMsgReconnectVolume:
			_ConnectVolume();
			if (!fMixerControl->Connected() && --fConnectRetries > 1) {
				BMessage reconnect(kMsgReconnectVolume);
				BMessageRunner::StartSending(this, &reconnect,
					6000000LL / fConnectRetries, 1);
			}
			break;

		default:
			return BView::MessageReceived(msg);
	}
}