문제

나는 a를 쓰고있다 Windows 형태 세 가지 사운드 파일을 재생 해야하는 응용 프로그램과 각 사운드 파일의 끝에서 이미지 소스를 변경하는 것입니다.

나는 그것을 사용하여 사운드를 재생하도록 할 수 있습니다 System.Media.SoundPlayer. 그러나 다른 스레드에서 사운드를 연주하는 것 같습니다.

이것의 순 효과는 마지막 소리 만 재생되고 모든 이미지가 변경된다는 것입니다.

난 노력 했어 Thread.Sleep, 그러나 그것은 전체 GUI를 자고 수면 기간이 지나면 모든 것이 한 번에 발생하고 마지막 소리가 재생되었습니다.

업데이트

나는 PlaySynch가 작동하고 있다고 생각했지만 이상적이지 않은 내 GUI를 얼리는 것 같습니다. 또 무엇을 할 수 있습니까?

도움이 되었습니까?

해결책

시도해 보았 니 SoundPlayer.playSync 메소드? 도움말에서 :

PlaySync 메소드는 현재 스레드를 사용하여 .wav 파일을 재생하여로드가 완료 될 때까지 스레드가 다른 메시지를 처리하지 못하게합니다.

다른 팁

재생 방법을 사용하는 대신 PlaySync 방법.

이 코드 사용 :

[DllImport("WinMM.dll")]
public static extern bool  PlaySound(byte[]wfname, int fuSound);

//  flag values for SoundFlags argument on PlaySound
public static int SND_SYNC        = 0x0000;      // Play synchronously (default).
public static int SND_ASYNC       = 0x0001;      // Play asynchronously.
public static int SND_NODEFAULT   = 0x0002;      // Silence (!default) if sound not found.
public static int SND_MEMORY      = 0x0004;      // PszSound points to a memory file.
public static int SND_LOOP        = 0x0008;      // Loop the sound until next sndPlaySound.
public static int SND_NOSTOP      = 0x0010;      // Don't stop any currently playing sound.
public static int SND_NOWAIT      = 0x00002000;  // Don't wait if the driver is busy.
public static int SND_ALIAS       = 0x00010000;  // Name is a registry alias.
public static int SND_ALIAS_ID    = 0x00110000;  // Alias is a predefined ID.
public static int SND_FILENAME    = 0x00020000;  // Name is file name.
public static int SND_RESOURCE    = 0x00040004;  // Name is resource name or atom.
public static int SND_PURGE       = 0x0040;      // Purge non-static events for task.
public static int SND_APPLICATION = 0x0080;      // Look for application-specific association.
private Thread t; // used for pausing
private string bname;
private int soundFlags;

//-----------------------------------------------------------------
public void Play(string wfname, int SoundFlags)
{
    byte[] bname = new Byte[256];    //Max path length
    bname = System.Text.Encoding.ASCII.GetBytes(wfname);
            this.bname = bname;
            this.soundFlags = SoundFlags;
            t = new Thread(play);
            t.Start();
}
//-----------------------------------------------------------------

private void play()
{
    PlaySound(bname, soundFlags)
}

public void StopPlay()
{
    t.Stop();
}

public void Pause()
{
    t.Suspend(); // Yeah, I know it's obsolete, but it works.
}

public void Resume()
{
    t.Resume(); // Yeah, I know it's obsolete, but it works.
}

아마도 원하는 것은 비동기 사운드를 수행하지만 사용자 응답에 응답하지 않는 방식으로 UI를 비활성화하는 것입니다. 그런 다음 사운드가 재생되면 UI를 다시 활성화 할 수 있습니다. 이렇게하면 여전히 UI를 정상적으로 페인트 할 수 있습니다.

나는 그것을하는 방법을 알아 냈습니다. 나는 PlaySynch를 사용했지만 코드와 별도의 스레드로 재생을 수행했습니다. 각 파일이 재생 된 후 동일한 스레드도 UI를 업데이트합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top