2011-12-16 4 views
0

여러 사운드 파일을 요소로 포함하는 ArrayList가 있습니다. foreach 루프는이 컬렉션을 반복하고 각 노트를 재생합니다.ArrayList에 저장된 모든 음악 파일을 재생하는 방법

문제는 프로그램이 실행될 때 마지막 음표 만 재생되지만 디버깅 할 때 모든 요소를 ​​통과하고 각 요소가 재생된다는 점입니다.

소리는 내 'MusicNote'클래스의 개체로 표시됩니다. 디버깅 할 때처럼 문제가 무엇인지 이해할 수 없다. 완벽하게 작동한다.

답변

3

사용 player.PlaySync() 대신이 완료된 파일을 재생하기 전에 긴 반환 것을 의미한다 새 스레드를 ... 시작 - 메인 스레드에서 또는 별도의에 (이 차단되기 때문에) 하나 실.

참고 : 디버깅 할 때 멀티 스레드 프로그램은 때로는 다르게 작동합니다 - 특히. 단계를 거치면 ...

+0

감사합니다. 이것이 문제였습니다! –

1

그것은 루프의 각 반복마다 기회 재생을하기 전에 파일을 설정하기 때문에 그 이유가 여기에있는 것처럼 보입니다. 마지막 반복 만로드하고 재생할 수 있습니다.

클립을 동시에 재생하려면 각 스레드가 클립을 재생하는 여러 스레드에서이 작업을 수행해야한다고 생각합니다.

순차적으로 재생하려면 재생 목록을 만든 다음로드하는 방법을 고려해야합니다.

2

나는 오래된 코드를 팠 봤는데,

당신이 전화 시도 할 수 있습니다 (WP7에서) 이런 식으로 구현했습니다

player.PlaySync(); 

문제는 SoundPlayer.Play()가 있다는 것이다 비동기식이므로 foreach를 막을 수 없습니다.

+0

감사합니다. 이것이 문제였습니다. –

0

오버 헤드가 시작을 건너 뛰지 않도록 출력을 초기화해야합니다. 나는 당신이 게임 엔진 밖에서도 이것을 어떻게 할 수 있는지 확신하지 못한다. 어쩌면 고정 길이 또는 오류 길이의 간격에 맞게 위조 된 노트를 추가 할 수 있습니다.

도움이 되었기를 바랍니다. 나는 위대한 대답은 아니지만 올바른 시도를 한 사람을 비난 할 수는 없다는 것을 이해한다.)

P. jasons 재생 목록 아이디어를 살펴보세요. 멋진 소식입니다.

0

noteList에 몇 개의 항목이 있습니까? "디버깅 할 때"는 무엇을 의미합니까? "프로그램 실행 시점"은 무엇을 의미합니까?

더욱이 Play()은 비동기 적으로 모든 소리가 동시에 재생되므로 하나만 연주되는 것처럼 보입니다. 대신 PlaySync()으로 전화 할 수 있습니다. 그러나 차단할 것이므로 별도의 스레드에서 수행하는 것이 좋습니다. http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspxplayer.Play()에 따르면

+0

감사합니다. 이것이 문제였습니다! –

0

메모 란 무엇입니까? 당신은 무엇을 가지고 놀고 있습니까? 파일의 종류는 무엇입니까?

재생을 호출하면 첫 번째 음표가 재생되기 시작하지만 다음 음표로 이동하고 첫 번째 음표가 취소되는 등 음표가 끝날 때까지 계속 연주 할 수 있습니다. 그 후에 아무것도 나오지 않기 때문에 완료하십시오. 놀이가 끝난 후 기다려서 문제인지 확인하십시오. 그렇다면 다음 단계로 가기 전에 메모가 끝날 때까지 기다릴 방법을 찾아야합니다.

관련 문제