5

Mac用に安くて陽気なサウンドボードを作成しました。NSSoundでさまざまなサウンドを次のように再生します。

-(void)play:(NSSound *)soundEffect:(BOOL)stopIfPlaying {
    BOOL wasPlaying = FALSE;

    if([nowPlaying isPlaying])  {
        [nowPlaying stop];
        wasPlaying = TRUE;
    }   

    if(soundEffect != nowPlaying)
    {
        [soundEffect play];
        nowPlaying = soundEffect;
    } else if(soundEffect == nowPlaying && ![nowPlaying isPlaying] && !wasPlaying) {
        [nowPlaying play];
    }
}

ただ止めるのではなく、数秒かそこらでフェードアウトしてほしいです。

4

3 に答える 3

1

メインスレッドのブロックを避けるために NSTimer を使用します。

于 2008-11-19T17:06:49.997 に答える
1

これはメソッドの最終バージョンです。

-(void)play:(NSSound *)soundEffect:(BOOL)stopIfPlaying {
    BOOL wasPlaying = FALSE;

    if([nowPlaying isPlaying])  {
        struct timespec ts;
        ts.tv_sec = 0;
        ts.tv_nsec = 25000000;

        // If the sound effect is the same, fade it out.
        if(soundEffect == nowPlaying)
        {
            for(int i = 1; i < 30; ++i)
            {
                [nowPlaying setVolume: (1.0 / i )];
                nanosleep(&ts, &ts);
            }           
        }

        [nowPlaying stop];
        [nowPlaying setVolume:1];
        wasPlaying = TRUE;
    }   

    if(soundEffect != nowPlaying)
    {
        [soundEffect play];
        nowPlaying = soundEffect;
    } else if(soundEffect == nowPlaying && ![nowPlaying isPlaying] && !wasPlaying) {
        [nowPlaying play];
    }
}

そのため、同じサウンドを渡す (つまり、同じボタンをクリックする) 場合にのみフェードアウトします。また、1 秒の粒度があるため、スリープではなくナノスリープを使用しました。

なぜ私の 200 ミリ秒の遅延が効果がないように見えるのかを突き止めようとしばらく苦労しましたが、200 NANOseconds は実際にはそれほど長くはありません :-)

于 2008-11-16T21:06:12.090 に答える
0

もしかしてこういうこと?おそらく、より直線的なドロップオフが必要ですが、基本的な考え方は、ループを作成し、次の更新まで一定期間スリープすることです。

if([nowPlaying isPlaying])  {
    for(int i = 1; i < 100; ++i)
    {
        [nowPlaying setVolume: (1.0 / i)];
        Sleep(20);
    }
    [nowPlaying stop];
    wasPlaying = TRUE;
}
于 2008-11-14T06:50:26.673 に答える