none
参考示例多page切换,背景播放mp3等音乐无法调整音量? Metro应用C++开发 RRS feed

  • 问题

  • 之前

    http://social.msdn.microsoft.com/Forums/zh-CN/metroappzhcn/thread/1bb38a9b-9ace-408d-9b9c-d54ecefce2ff

    衍生的问题,之前的问题已经解决,重新提交一个。

    无法调整音量的问题存在,未解决。

    但是碰到一个问题,反复试了多次,无法修改声音音量的大小,不知为何?

    PlaybackControl

      OutputMedia->Volume = volume/100;//volume为1~100的值

    不知是调用的方法不对,还是就不支持调整音量?

    补充一句,好像示例中没有添加修改音量的功能。

     

    void PlaybackControl::SetVolume(double volume)
    {
      OUTPUT_FUN_LINE;
       cw->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([=]()
        {
      OutputMedia->Volume = volume/100;//volume为1~100的值
      OUTPUT("SetVolume %f",OutputMedia->Volume);
        }
        , CallbackContext::Any));
    }


    • 已编辑 QitaoFan 2012年7月30日 8:30
    2012年7月30日 6:40

答案

  • 因为我们是先开发其他功能,最后再开发背景播放功能的,其他的页面基本上都是直接使用page,一个一个page直接切换的。

    如果要修改成你说的方式,需要修改的地方可能比较多,不行只能先这样了。

    不过,我同样不解,既然是声音背景播放,为何和显示有关系。

    • 已标记为答案 QitaoFan 2012年8月2日 2:22
    2012年8月2日 2:22

全部回复

  • 不好意思,明白了,你是参考例子写的。

    后台播放需要通过系统音量调节,而不是MediaElement的。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月30日 11:31
    版主
  • 那也就是说,这种后台播放背景音的,应用不能调整音量,只能windows系统的小喇叭来调整音量,是吗?
    2012年7月30日 11:38
  • 后台播放由MediaControl控制,他没有提供音量选项得API,由系统的 Volume Flyout提供,参考:http://msdn.microsoft.com/en-us/library/windows/hardware/hh833781

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月30日 11:38
    版主
  • 不过你可以在你调节音量的时候 让  MediaControl.IsPlaying = false , 调节后再设置为true。 因为你的应用调节肯定是在前台,不会到后台的。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月30日 12:04
    版主
  • 不太明白,修改成如下?还是不起作用

    void PlaybackControl::SetVolume(double volume)
    {
      OUTPUT_FUN_LINE;
     MediaControl::IsPlaying = false;
      OutputMedia->Volume = volume/100;
      OUTPUT("SetVolume %f",OutputMedia->Volume);
       MediaControl::IsPlaying = true;

      // cw->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([=]()
      //  {
      ////OutputMedia->Pause();
      ////OutputMedia->Play();
      //  }
      //  , CallbackContext::Any));
    }

    System Transport Controls Developer Guide 文档中就这么一点:

    Volume Flyout
    The most basic form of the volume flyout is the volume control alone. The volume flyout is activated by pressing the hardware Volume Up or Volume Down keys on the device or any of the transport controls (such as Play, Pause, and Stop). The volume indicated in the flyout is the default endpoint volume in the case of keyboard, laptop, and device volume controls and the specific device endpoint in the case of headsets and Bluetooth devices.

     


    • 已编辑 QitaoFan 2012年7月30日 14:25
    2012年7月30日 14:24
  • void PlaybackControl::SetVolume(double volume)
    {
      OUTPUT_FUN_LINE;
      cw->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([=]()
      {
        if (MediaControl::IsPlaying)
          MediaControl::IsPlaying = false;
        OutputMedia->Volume = volume/100;
        OUTPUT("SetVolume %f",OutputMedia->Volume);
        MediaControl::IsPlaying = true;
      }
      , CallbackContext::Any)); 
    }

    这样呢? 因为我直接测试了C#的版本,是可行的。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月31日 2:32
    版主
  • 测试了你的代码,还是不起作用,音量没有变化,调到最小和最大都一样

    void PlaybackControl::SetVolume(double volume)
    {
      OUTPUT_FUN_LINE;
       cw->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([=]()
        {
        if (MediaControl::IsPlaying) MediaControl::IsPlaying = false;
       
     OutputMedia->Volume = volume/100;
         OUTPUT("SetVolume %f",OutputMedia->Volume);
        MediaControl::IsPlaying = true;

        }
        , CallbackContext::Any));
    }

    控件操作有问题,还是C++这么操作有问题?

    2012年7月31日 3:17
  • 仔细看了一下差异,我在使用PlaybackControl时,不是静态的加载到xaml page上面

    而是动态ref new的,是否是这个原因

    因为是希望在各个page切换的时候仍然可以继续播放,之前MediaElement就是,静态加载到一个页面上

    page一切换就没了

    2012年7月31日 3:36
  • 你是否在参考示例代码上直接测试的,这个上面是起作用,和语言没关系。

    我也试了,在page中加入此控件

                <local:PlaybackControl x:Name="Playback"/>

    是可以调节音量大小,并播放

    但是有一个和MediaElement一样的问题,就是在此page被切换到其他page时

    一样也会停止,就不播了,我们是希望在各个页面切换的同时,可以一直连续背景播放;并且可以调整音量

    现在前后冲突,可以各个页面切换并背景播放,但是不能调整音量了。

    2012年7月31日 4:12
  • 是的,我直接在例子上进行的修改。

    我这里比较疑惑的是,为什么要不断地ref new 一个PlayControl 才能达到切换页面不停止播放。

    我的理解是,在MainPage 中,你完全可以腾出一块区域放这个 PlayControl, 剩下的区域或者整个MainPage背景可作为一个Frame来实现Page间的导航。简单的讲,就是将PlayControl放入MainPage 主页面,且不让主页面被导航出当前窗口,让其一直维持在那。 我试用了下Store中的QQ Music,感觉你也可以参考他的设计,放一个PlayControl在页面上,然后在上方进行各种页面的导航,但不影响PlayControl.


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us


    2012年8月1日 8:15
    版主
  • 因为我们是先开发其他功能,最后再开发背景播放功能的,其他的页面基本上都是直接使用page,一个一个page直接切换的。

    如果要修改成你说的方式,需要修改的地方可能比较多,不行只能先这样了。

    不过,我同样不解,既然是声音背景播放,为何和显示有关系。

    • 已标记为答案 QitaoFan 2012年8月2日 2:22
    2012年8月2日 2:22