游戏开发论坛

 找回密码
 立即注册
搜索
查看: 12252|回复: 13

openal的两个很棘手的问题!那位大侠给解决了,小弟佩服

[复制链接]

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2006-11-30 20:42:00 | 显示全部楼层 |阅读模式
本人最近在用openal,不是太熟练。两个问题请教:
1)我的机器上有3个声卡,如何让我的声音在特定的一个声卡上播放?
2)如何可以动态地调整声音的播放频率,即可以控制声音播放的速度,且不改变声音当前的播放点位置?
两个问题小弟已经郁闷了好长时间!那位能帮个忙,我先谢谢了!

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2006-11-30 20:51:00 | 显示全部楼层

Re:openal的两个很棘手的问题!那位大侠给解决了,小弟佩

1.通过之前的贴子所言的枚举OpenAL设备即可。

2.每个source的频率,音量本身就可以通过alSource调整,和位置并无关联。

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2006-12-1 09:35:00 | 显示全部楼层

Re:openal的两个很棘手的问题!那位大侠给解决了,小弟佩

hyzboy大侠能不能说的清楚一些,小弟愚笨!
特别是第二个问题.

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2006-12-1 11:27:00 | 显示全部楼层

Re:openal的两个很棘手的问题!那位大侠给解决了,小弟佩

前贴“请教:怎么得到Device的名字?”,我的回贴里正是枚举OpenAL设备的代码,但必须OpenAL 1.1,所以请更新OpenAL驱动。

我不知道你是怎么调整音量和坐标的,但每个音源设置独立是OpenAL的特色。

Linstener是收听者的

Source是音源,每个音源的坐标,播放频率,增益等等都是独立的。

alSourcef(index,AL_GAIN,gain);是调整音源index的增益
alSourcef(index,AL_PITCH,pitch);是调整音源index的频率

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2006-12-4 11:23:00 | 显示全部楼层

Re: openal的两个很棘手的问题!那位大侠给解决了,小弟佩

hyzboy大哥谢谢了,真是好人啊,祝你好人好运!

  我的第二个问题解决了,可是第一个问题还是不行,我装的是openal1.1,但是当我对我机器上的声卡进行操作时就是不行,无论我怎样来枚举设备,我的声音都是在windows默认的声卡进行播放的,我从控制面板上选择声卡时,发现我机器上的三个声卡的名字是一样的,只是每个声卡的端口不一样,原因是什么就是不明白。请指教。
不知道大侠能不能给给具体的工程例子,那就太谢谢了!

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2006-12-4 11:41:00 | 显示全部楼层

Re:openal的两个很棘手的问题!那位大侠给解决了,小弟佩

你必须使用你枚举出来的设备名称进行初始化。

如果你枚举出来的3个设备名称相同,,,,那我还真不知道怎么解决。但按OpenAL的编程手册来看,似乎不会有这种现象。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2006-12-7 10:49:00 | 显示全部楼层

Re:openal的两个很棘手的问题!那位大侠给解决了,小弟佩

1)我的机器上有3个声卡,如何让我的声音在特定的一个声卡上播放?
答:不能,因为任何声音在播放的时候,3个声卡都是同时发声的.

2)如何可以动态地调整声音的播放频率,即可以控制声音播放的速度,且不改变声音当前的播放点位置?
答:先
alSourcePlay(alSource);//开始播放,然后再
alSourcef(index,AL_GAIN,gain);//是调整音源index的增益
alSourcef(index,AL_PITCH,pitch);//是调整音源index的频率

请楼主不要在意我说什么,因为我是个外行,是个菜鸟.

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2006-12-7 11:27:00 | 显示全部楼层

Re:openal的两个很棘手的问题!那位大侠给解决了,小弟佩

snhun大哥说的第一个问题不对,我的声音总是在系统选择的默认声卡上播放,而不是三个都响.
hyzboy老大,我的多声卡问题还没有解决,不知道你有没有处理过这样的问题,
到底openal对声卡能不能进行操作,我怀疑它的函数不是底层的API函数.前面你说的使用枚举出来的设备名称进行初始化,如何进行?使用哪个函数?是alutInit(,)?,请帮帮忙吧,谁帮我把问题解决了,留下地址我有好礼物向送!!
我的qq:597085083,欢迎交流!

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2006-12-7 11:48:00 | 显示全部楼层

Re:openal的两个很棘手的问题!那位大侠给解决了,小弟佩

第一个程序里不是有一句用PutInfo输出设备名吗?你改成你函数就好了!

然后在OpenAL的初始化中,alcOpenDevice中不是需要放一个名字进去吗!放枚举出来的某一个就行了。

----------------------------------------------------------------------------------------
OpenAL 1.1之后有一个枚举当前系统设备的扩展。

if(!alcIsExtensionPresent)return;
if(!alcIsExtensionPresent(NULL,"ALC_ENUMERATION_EXT"))return;

char *devices;
const char *actual_devicename;

devices=(char *)alcGetString(NULL,ALC_DEVICE_SPECIFIER);
//default_devicename=(char *)alcGetString(NULL,ALC_DEFAULT_DEVICE_SPECIFIER);

while(*devices)
{
ALCdevice *device=alcOpenDevice(devices);

if(device)
{
ALCcontext *context=alcCreateContext(device,NULL);
if(context)
{
alcMakeContextCurrent(context);

actual_devicename=alcGetString(device,ALC_DEVICE_SPECIFIER);

int major,minor;

alcGetIntegerv(device,ALC_MAJOR_VERSION,sizeof(int),&major);
alcGetIntegerv(device,ALC_MINOR_VERSION,sizeof(int),&minor);

PutInfo("OpenAL设备: <%s>,支持OpenAL特性版本: %d.%d",actual_devicename,major,minor);

alcDestroyContext(context);
}

alcCloseDevice(device);
}

devices+=strlen(devices)+1;
}

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2006-12-7 20:56:00 | 显示全部楼层

Re:openal的两个很棘手的问题!那位大侠给解决了,小弟佩

hyzboy老大请看我的程序代码:
我先用你的代码枚举设备名称如下:
                char *devices;
        const char *actual_devicename;
        devices=(char *)alcGetString(NULL,ALC_DEVICE_SPECIFIER);
        while(*devices)
        {
                ALCdevice *device=alcOpenDevice(devices);
                if(device)
                {
                        ALCcontext *context=alcCreateContext(device,NULL);
                        if(context)
                        {
                                alcMakeContextCurrent(context);

                                actual_devicename=alcGetString(device,ALC_DEVICE_SPECIFIER);                               
                                AfxMessageBox(actual_devicename);
                                alcDestroyContext(context);
                        }

                        alcCloseDevice(device);
                }

                devices+=strlen(devices)+1;
        }
然后我用其中的一个设备名进行播放,初始化如下:
                m_Name="Generic Software";
        m_device = alcOpenDevice(m_Name);
        m_context=alcCreateContext(m_device,NULL);
        alcMakeContextCurrent(m_context);       
               ...播放声音的代码..
其中我自己定义了播放声音的变量:
char *m_Name;
ALCdevice *m_device;
ALCcontext *m_context;
然而我如何更改m_Name为其他的设备名,声音总是还在默认的声卡上播放!
我就是把m_Name的内容为空或胡乱写一个名字还是在系统默认的声卡上播放声音!
不知道是什么原因?
好郁闷呐!!!
请大侠指教啊!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 02:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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