我正在iPhone上使用OpenAL声音框架,而我正在为各个声音设置不同的音量。我遇到了一个问题,当我从一个声音切换到另一个声音时,我听到一声初始的砰砰声/咔嗒声。
当我有一个高音量(1.0)和一秒钟的声音时,它真的很明显 声音低(0.2)。当我发出响亮的声音,然后 听到柔和的声音,我听到弹出/咔嗒声。但是当我离开柔软的时候 声音响亮,我什么都没注意到。所以pop / click真的 从大声切换到柔和声音时会发生。
这是init声音方法:
- (id) initWithSoundFile:(NSString *)file doesLoop:(BOOL)loops
{
self = [super init];
if (self != nil)
{
if(![self loadSoundFile:file doesLoop:loops])
{
debug(@"Failed to load the sound file: %@...", file);
[self release];
return nil;
}
self.sourceFileName = file;
//temporary sound queue
self.temporarySounds = [NSMutableArray array];
//default volume/pitch
self.volume = 1.0;
self.pitch = 1.0;
}
return self;
}
这是播放功能:
- (BOOL) play
{
if([self isPlaying]) //see if the base source is busy...
{
//if so, create a new source
NSUInteger tmpSourceID;
alGenSources(1, &tmpSourceID);
//attach the buffer to the source
alSourcei(tmpSourceID, AL_BUFFER, bufferID);
alSourcePlay(tmpSourceID);
//add the sound id to the play queue so we can dispose of it later
[temporarySounds addObject: [NSNumber numberWithUnsignedInteger:tmpSourceID]];
//a "callback" for when the sound is done playing +0.1 secs
[self performSelector:@selector(deleteTemporarySource)
withObject:nil
afterDelay:(duration * pitch) + 0.1];
return ((error = alGetError()) != AL_NO_ERROR);
}
//if the base source isn't busy, just use that one...
alSourcePlay(sourceID);
return ((error = alGetError()) != AL_NO_ERROR);
}
这里是我在播放后立即为每个声音设置音量的功能(我已尝试在播放之前设置它):
- (void) setVolume:(ALfloat)newVolume
{
volume = MAX(MIN(newVolume, 1.0f), 0.0f); //cap to 0-1
alSourcef(sourceID, AL_GAIN, volume);
//now set the volume for any temporary sounds...
for(NSNumber *tmpSourceID in temporarySounds)
{
//tmpSourceID is the source ID for the temporary sound
alSourcef([tmpSourceID unsignedIntegerValue], AL_GAIN, volume);
}
}
我非常感谢任何帮助,因为我已经尝试了所有我能想到的东西。我会非常感激。
答案 0 :(得分:3)
我所要做的就是使用calloc而不是malloc来为OpenAL缓冲区分配内存。 或者您也可以使用memset将内存置零。
奇怪的砰砰声响起。这是由于我的情况下的垃圾记忆。这就是为什么它也是随机的。希望这会有所帮助。
答案 1 :(得分:1)
此问题是由于未调用alSourceStop引起的。
文档并没有真正说明这一点,但是必须在声源上调用alSourceStop才能重用它,即使声音已经完成且源的AL_SOURCE_STATE参数不是AL_PLAYING。
答案 2 :(得分:0)
我随机得到了这个未解决的问题,并且发现问题没有解决,即使很长一段时间过去,我也会尝试给出答案。
我不知道OpenAL,但听起来这是纯粹的音频问题。当您突然改变音频电平时,听到短暂的咔嗒声是正常的,特别是从高值到低值。例如,如果直接将音频的音量映射到滑块,每隔几毫秒更新一个值,则可以在快速滑动控件时轻松听到咔嗒声和砰砰声。音频软件开发人员所做的是使用低通滤波器平滑参数变化。 在你的情况下,我建议你在淡出它之后停止剪辑,并通过淡入淡出来开始一个新的剪辑。淡入淡出时间可以短至2毫秒:它听不到,声音会很好地播放。
我想知道(某些版本的)OpenAL是否可以自动处理这个问题。