2008-11-13 2 views
5

NSSound 객체를 페이드, 나는 다음과 같이 NSSound와 다양한 사운드를 재생하는 방법 :내 Mac 용으로 싼 & 명랑 사운드 보드를 작성했습니다

-(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]; 
    } 
} 

그냥 죽은 중지하기보다는, I 몇 초가 지나면 사라지기를 좋아합니다.

답변

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]; 
    } 
} 

단지 페이드 아웃 (즉, 같은 버튼을 클릭), 또한, 나는 nanosleep를 갔다 1 초의 세분성을 가지고 있기 때문에 수면보다는 오히려 수면 상태입니다.

나는 내 200 밀리 초 지연이 어떤 영향을 미칠 것 같지 않은 이유를 해결하려고 노력하는 동안 고투, 그러나 200 나노초 정말 그렇게 오래되지

0

아마도 이와 비슷한 것일 수 있습니까? 좀 더 선형적인 감소를 원하지만, 기본 아이디어는 루프를 만들고 다음 업데이트까지 시간을 잠자는 것입니다.

if([nowPlaying isPlaying]) { 
    for(int i = 1; i < 100; ++i) 
    { 
     [nowPlaying setVolume: (1.0/i)]; 
     Sleep(20); 
    } 
    [nowPlaying stop]; 
    wasPlaying = TRUE; 
} 
+0

방금 ​​Chris를 시도한 Sleep 함수는 전체 노트북을 잠자기 상태로 만들었습니다. 수면은 잘 동작하지만 밀리 초가 아닌 초 단위로 걸리는 매개 변수는 예외입니다. –

+0

너에게 잘못한 시프트 키를 저주한다! –

1

내가 NSTimer을 사용 :-) 그 것이다 주 스레드를 막지 않도록합니다.

+0

정확히 NSTimer를 얼마나 정확하게 사용할 수 있는지 자세히 설명해 주시겠습니까? – Matt

관련 문제