VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 445|回复: 6

[求助] IBasicAudio 的put_Volume如何正确设置

[复制链接]
16_avatar_middle
在线会员 突突突突 发表于 2018-1-10 11:39:27 | 显示全部楼层 |阅读模式
3驿站币
本帖最后由 突突突突 于 2018-1-10 11:40 编辑

put_Volume 现在做一个音乐播放器,但是现在音量设置的时候老是觉得不正常,msdn上说的是-10000最小到0 但是根据滑块设置的位置和值直接传进来。音量是没有变化的,或者不正常。是不是跟系统音量也有关系,需要先获取系统音量么。最好能提供一下简单的代码多谢
if (!m_pGraph)
                return false;
        HRESULT hr = m_pGraph->QueryInterface(IID_IBasicAudio, (void **)&m_pAudio);
        //long Volume = 100 + nSize*0.01;//把-10000~0转换成0~100
        if (m_pAudio!=NULL)
        {

                hr = m_pAudio->put_Volume(nSize);
                return SUCCEEDED(hr);
        }
        return false;
设置的代码





上一篇:大神们求带啊VC++
下一篇:到底什么意思?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

51_avatar_middle
online_admins Syc 发表于 2018-1-10 11:43:07 | 显示全部楼层
试试这个,看看有没有启发?

本来这个问题没有任何悬念,但是,事实上并不是简单调用一下IBasicAudio.put_Volume就成了。我的实现代码如下,已在调试中通过,多谢VC+DirectShow+AVS的“上海--阿易”兄的帮助。
        private int[] volumes = new int[]{-10000,-6418,-6147,-6000,
        -5892,-4826,-4647,-4540
        -4477, -4162,-3876, -3614, -3500,
        -3492,-3374,-3261,-3100,-3153,-3048,-2947,-2849,-2755,-2700,
        -2663,-2575,-2520,-2489,-2406,-2325,-2280,-2246,-2170,-2095,-2050,
        -2023,-1952,-1900, -1884,-1834, -1820, -1800,-1780, -1757,-1695,-1636,-1579,
        -1521,-1500,-1464,-1436,-1420, -1408,-1353,-1299,-1246,-1195,-1144,
        -1096,-1060, -1049,-1020,-1003,-957,-912,-868, -800, -774,-784, -760, -744,
        -705,-667,-630,-610,-594,-570 ,-558,-525,-493,-462,-432,-403,
        -375,-348,-322,-297,-285, -273,-250,-228,-207,-187,-176, -168,
        -150,-102,-75,-19,-10,0,0};

   /// <summary>
        /// 获得、设置音量
        /// </summary>
        public int Volume
        {
            get
            {
                if (basicAudio == null) return 0;
                int hr = 0, volume = 0;
                hr = basicAudio.get_Volume(out volume);
                DsError.ThrowExceptionForHR(hr);
                foreach (int v in volumes)
                    if (v >= volume) { volume = v; break; }
                return volume;
            }
            set
            {
                if (basicAudio == null) return;
                if (value < 0) value = 0;
                if (value >= 100) value = 99;
                int hr = 0;
                hr = basicAudio.put_Volume(volumes[value]);
                DsError.ThrowExceptionForHR(hr);
            }
        }
  本来,directshow中的音量范围是在-10000至0之间,但是我发现,0总是代表当前已有的音量,也就是说播放器只能在已有音量上减小,而不能有所增加。这是个很让人头痛的问题。阿易兄的vc版实现启发了我。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-1-10 11:44:15 | 显示全部楼层
还有一种方法:
//FVolume 0-100
put_Volume(Trunc(2000.0 * Log10(Power( 10.0, -80.0) + FVolume / 100 )));

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-1-10 11:53:00 | 显示全部楼层
网上找了个使用 DirectShow 播放MP3的C++代码,里面用到了 put_Volume,楼主可以参考下,原文链接在这里:
Simple C++ DirectShow MP3 Player Class
https://www.codeproject.com/arti ... how-mp-player-class

相关代码我已经下载下来了,传上来!
IBasicAudio 的put_Volume如何正确设置 cppmp3player-ver071.zip (127.46 KB, 下载次数: 1)

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-1-10 11:55:18 | 显示全部楼层
这里还有一个:
A simple console DirectShow player
https://www.codeproject.com/Arti ... e-DirectShow-player
IBasicAudio 的put_Volume如何正确设置 ConsolePlayer.zip (2.08 MB, 下载次数: 1)

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

16_avatar_middle
ico_lz  楼主| 突突突突 发表于 2018-1-10 13:53:29 | 显示全部楼层
Syc 发表于 2018-1-10 11:55
这里还有一个:
A simple console DirectShow player
https://www.codeproject.com/Articles/30450/A-sim ...

现在是进度条设置到一半的时候声音就没有了。比如系统设置的是最大声音,那么进度条就能走到底,如果系统声音在50那么在进度条一半的时候就没有声音了。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-1-10 13:56:05 | 显示全部楼层
突突突突 发表于 2018-1-10 13:53
现在是进度条设置到一半的时候声音就没有了。比如系统设置的是最大声音,那么进度条就能走到底,如果系统 ...

那就得获取一下系统当前的音量,之后按照当前音量来设置进度条的位置了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-11 05:10

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表