NetCoreAudio

NetCoreAudio-Github - 링크

  • 해당 라이브러리를 사용하면 모든 운영 체제의 .NET Core 환경에서의 오디오 파일 사용이 가능해집니다.

메서드

Play(string filePath)

  • 현재 재생을 중지하고, 지정된 오디오 파일을 재생
  • 재생 bool 은 true, 일시 중지는 false

Pause()

  • 일시 정지
  • bool 은 true를 반환

Resume()

  • 일시 정지 되어있던 재생을 다시 시작
  • Pause bool = true

    Stop()

  • 재생을 정지하고 버퍼를 삭제
  • 정지 된 재생을 Resume 처럼 중단 지점에서 시작이 불가능함
  • 처음부터만 재생 가능

SetVolume()

  • 재생 볼륨을 0 - 100 까지 설정 가능

Events()

  • 이벤트 핸들러 처리 가능

해당 라이브러리를 사용하게 된 이유

  • 팀 협업시에 Window 사용자의 WaveAudio 라이브러리를 사용하면 간편
  • 하지만 Mac 또는 다른 OS 사용자의 경우 해당 메서드를 실행하면 다음과 같은 에러가 발생
using NAudio.Wave;

static AudioFileReader startBGM = new AudioFileReader(startBGMPath); 

static LoopStream startLoop = new LoopStream(startBGM); 

static AudioFileReader newWorldBGM = new AudioFileReader(newWorldBGMPath); 

static LoopStream newWorldLoop = new LoopStream(newWorldBGM); 

static WaveOutEvent audioOutput = new WaveOutEvent(); 

static AudioFileReader audioFile = new AudioFileReader(startBGMPath)

public override void Start() 
{ 
	CursorVisible = false; 
	audioOutput.Init(audioFile); 
	audioOutput.Play(); 
}
  • Exception Error Log
Unhandled exception. System.DllNotFoundException: Unable to load shared library 'winmm.dll' or one of its dependencies. In order to help diagnose loading problems, consider setting the DYLD_PRINT_LIBRARIES environment variable: dlopen(/usr/local/share/dotnet/shared/Microsoft.NETCore.App/7.0.5/winmm.dll.dylib, 0x0001): tried: '/usr/local/share/dotnet/shared/Microsoft.NETCore. App/7.0.5/winmm.dll.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/share/dotnet/shared/Microsoft.NETCore.App/7.0.5/ winmm.dll.dylib' (no such file), '/usr/local/share/dotnet/shared/Microsoft.NETCore.App/7.0.5/winmm.dll.dylib' (no such file) dlopen(/Users/daniel/Documents/GitHub/HexCore/TeamDungeon/HexaCoreVillage/bin/Debug/net7.0/winmm.dll.dylib, 0x0001): tried: '/Users/daniel/Documents/GitHub/HexCore/TeamDungeon/ HexaCoreVillage/bin/Debug/net7.0/winmm.dll.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Users/daniel/Documents/GitHub/HexCore/TeamDungeon/HexaCoreVillage/bin/ Debug/net7.0/winmm.dll.dylib' (no such file),

winnm.dll을 참조하는 해당 라이브러리들은 Window에 종속이 되어 Mac, Linux 계열에서는 실행이 불가능해짐

문제 해결

AudioController Class

  • 인터페이스에서 인스턴스를 생성 후 해당 인스턴스를 static으로 선언
  • 모든 Class 에서 사용 가능하도록 메서드 화
using NetCoreAudio.Interfaces;  
  
namespace HexaCoreVillage.Utility  
{  
	public class AudioPlayer  
	{  
		public enum PlayOption { Play, Pause, Resume, Stop, Change}  
		private static readonly IPlayer _audioPlayer = new NetCoreAudio.Player();  
		  
		/// <summary>  
		/// 오디오 플레이어 메서드  
		/// </summary>  
		/// <param name="filePath">Audio File Path</param>  
		/// <param name="playOption">Play : 재생, Pause : 일시정지, Resume : 재실행, Stop : 중지, Change : 파일 바꾸기</param>  
		public static void AudioController(string filePath, PlayOption playOption)  
		{  
			switch (playOption)  
			{  
				case PlayOption.Play:  
				_audioPlayer.Play(filePath);  
				break;  
				case PlayOption.Pause:  
				_audioPlayer.Pause();  
				break;  
				case PlayOption.Resume:  
				_audioPlayer.Resume();  
				break;  
				case PlayOption.Stop:  
				_audioPlayer.Stop();  
				break;  
				case PlayOption.Change:  
				_audioPlayer.Stop();  
				_audioPlayer.Play(filePath);  
				break;  
			}  
		}  
	}  
}

사용

AudioController(startBGMPath,PlayOption.Play);
  • 오히려 기존 코드보다 간결해졌으며, 많은 Using 선언 및 필드를 객체화 시킬 필요 없음

기존 Field 구성

 static AudioFileReader startBGM = new AudioFileReader(startBGMPath);  
 static LoopStream startLoop = new LoopStream(startBGM);  
 static AudioFileReader newWorldBGM = new AudioFileReader(newWorldBGMPath);  
 static LoopStream newWorldLoop = new LoopStream(newWorldBGM);  
 static WaveOutEvent audioMgr = new WaveOutEvent();

마치며

자주 사용하거나 이용하게 될 라이브러리는 아니지만, 협업에 있어서 서로 같은 팀이 함께하면서 다른 작업 환경에도 거기서 어쩔수 없다고 하는 것이 아닌 할 수 있는 방법을 찾는 것이 중요 작업 환경 문제로 인한 것들은 충분히 대체할 수 있는 Cross Platform 도구를 찾는 것도 개발자의 역량이라고 생각합니다.