KMusic Player 소스에서 사용된 로컬 폴더에 접근해서 파일 목록 가지고 오고, 파일 정보를 조회하는 방법에 대해서 설명하도록 하겠다.

오픈 소스 : http://kaki104.tistory.com/104

1. Music Library에 접근하기

Package.appxmanifest 파일을 열면 Capabilities라는 탭이 존재 한다. 그곳에서 Music Library를 선택해 주어야 그 곳에 Music Library폴더에 접근할 수 있게 된다.

2. FileOpenPicker
파일을 열거나 선택하는데 사용되는 것으로, 몇개의 프로퍼티를 사용하면, 시작 위치나, 확장자를 지정 할 수 있게 된다.

ICommand addPlaylist;
/// <summary>
/// 추가 커맨드
/// </summary>
public ICommand AddPlaylistCommand
{
    get
    {
        if (addPlaylist == null)
        {
            addPlaylist = new DelegateCommand(async obj =>
            {
                //피커를 생성하고
                FileOpenPicker picker = CreateFilePicker(audioExtensions);
                //여러개의 파일을 선택하는 팝업 다이얼로그 창을 연다. 반환 형식은 StorageFile들로 StorageFile을 컨트롤 하는 것에 익숙해져야 한다.
                var files = await picker.PickMultipleFilesAsync();
                //선택된 파일이 있으면
                if (files != null && files.Count > 0)
                {
                    //파일들로 Playlist를 만들고
                    await createPlaylist(files);
                    //중지 상태 였다면 플레이를 시작한다.
                    if(wasPlaying == false)
                        await setCurrentPlayingAsync(currentSongIndex);
                }
            });
        }
        return addPlaylist;
    }
}

//새로운 FileOpenPicker를 생성한다.
private FileOpenPicker CreateFilePicker(string[] extensions)
{
    //피커를 만들고
    FileOpenPicker picker = new FileOpenPicker();
    //시작위치를 뮤직라이브러리로 지정하고
    picker.SuggestedStartLocation = PickerLocationId.MusicLibrary;
    //확장자를 하나씩 추가한다. 확장자는 필수 사항이다.
    foreach (string extension in extensions)
    {
        picker.FileTypeFilter.Add(extension);
    }
    return picker;
}

3. Playlist 만들기

//Playlist를 이용해서 Playlist만들기 - Playlist를 선택 후 실행되는 곳
async Task createPlaylist(Playlist pl)

{
    currentSongIndex = -1;
    SongCollection.Clear();

    if (pl.Files.Count > 0)
    {
        //Playlist에 Files 프로퍼티의 파일 정보를 가지고 SongModel생성
        foreach (StorageFile file in pl.Files)
        {
            SongModel newSong = new SongModel(file);
            await newSong.getMusicPropertiesAsync();
            SongCollection.Add(newSong);
        }
        currentSongIndex = 0;
    }
}

//StorageFile들을 가지고 Playlist만들기 - 파일 선택 후 실행되는 곳
async Task createPlaylist(IReadOnlyList<StorageFile> files)

{
    if (files.Count > 0)
    {
        // Create the playlist
        foreach (StorageFile file in files)
        {
            //파일을 이용해서 songModel을 생성하고
            SongModel newSong = new SongModel(file);
            //파일의 정보를 조회하고
            await newSong.getMusicPropertiesAsync();
            //컬렉션에 추가
            SongCollection.Add(newSong);
        }
    }
}

SongModel.cs

//음악파일에서 추가 정보 조회
public async Task getMusicPropertiesAsync()

{
    var properties = await this.File.Properties.GetMusicPropertiesAsync();
    Artist = properties.Artist;            //음악가
    Album = properties.Album;         //앨범명
    Title = properties.Title;               //제목
    Rating = properties.Rating;         //선호도
    Duration = properties.Duration;   //플레이시간

    //파일에서 이미지 가지고 오기
    var thumb = await this.File.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.MusicView, 250);
    BitmapImage bi = new BitmapImage();
    bi.SetSource(thumb);
    AlbumImage = bi;
}

 

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

앱에서 환경 설정 데이터를 저장하는 방법과 불러오는 방법을 설명하도록 하겠다. 사용된 소스는
http://kaki104.tistory.com/104
포스트에 있는 KMusic Player 소스를 사용한다.

1. 저장하기
suspensionManager는 MS의 Sample 프로젝트에 포함되어 있는 클래스인데, 서스펜션 모드로 넘어갈 때 사용 중이던 데이터를 저장하는 용도로 사용 하는데, 몇개의 메소드를 추가해서 데이터를 저장하고 불러오는 용도로 사용할 수 있다.

SuspensionManager.SaveSetting() 메소드를 이용해서 저장할 데이터를 입력하고, SuspensionManager.SaveAsync() 메소드를 호출해서 저장을 할 수 있고, 이곳을 통해서 저장을하면, Collection 객체와 같은 데이터들을 Serializer를해서 저장을 해준다.

SaveSetting 호출 시 입력하는 데이터의 타입을 꼭 넣어 주어야만 저장이 가능하고, 타입은 일반적으로 사용자가 만들은 Model정도를 저장하기 적합하다.

    /// <summary>
    /// 저장
    /// </summary>
    static public void SaveSetting(Type type, string key, object data)
    {
        if(SuspensionManager.KnownTypes.Count(p => p is Type) == 0)
            SuspensionManager.KnownTypes.Add(type);

        if(SuspensionManager.SessionState.Count(p => p.Key == key) == 0)
            SuspensionManager.SessionState.Add(key, data);
        else
            SuspensionManager.SessionState[key] = data;
    }


    // Save the current session state
    static async public Task SaveAsync()
    {
        // Get the output stream for the SessionState file.
        StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
        IRandomAccessStream raStream = await file.OpenAsync(FileAccessMode.ReadWrite);
        using (IOutputStream outStream = raStream.GetOutputStreamAt(0))
        {
            // Serialize the Session State.
            DataContractSerializer serializer = new DataContractSerializer(typeof(Dictionary<string, object>), knownTypes_);
            serializer.WriteObject(outStream.AsStreamForWrite(), sessionState_);
            await outStream.FlushAsync();
        }
    }

2. 불러오기
RestoreSetting() 메소드를 이용해서 불러올 데이터의 타입을 입력하고, RestoryAsync() 메소드를 이용해서 불러들인 후 GetData() 메소드를 이용해서 Object에 입력한다.

    /// <summary>
    /// Type 입력
    /// </summary>
    /// <returns></returns>
    static public void RestoreSetting(Type type)
    {
        SuspensionManager.KnownTypes.Add(type);
    }

    // Restore the saved sesison state
    static async public Task RestoreAsync()
    {
        // Get the input stream for the SessionState file.
        try
        {
            StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(filename);
            if (file == null) return;
            IInputStream inStream = await file.OpenSequentialReadAsync();

            // Deserialize the Session State.
            DataContractSerializer serializer = new DataContractSerializer(typeof(Dictionary<string, object>), knownTypes_);
            sessionState_ = (Dictionary<string, object>)serializer.ReadObject(inStream.AsStreamForRead());
        }
        catch (Exception)
        {
            // Restoring state is best-effort.  If it fails, the app will just come up with a new session.
        }
    }

    static public object GetData(string key)
    {
        object returnValue = null;
        if (SessionState.ContainsKey(key) == true)
            returnValue = SessionState[key];
        return returnValue;
    }

3. 사용 예제

MainPageViewModel.cs

//현재 플레이리스트 파일명과 폴더명을 저장한다.
SuspensionManager.SaveSetting(typeof(string), "CurrentPlaylistFileName", CurrentPlaylistFileName);
SuspensionManager.SaveSetting(typeof(string), "currentPlaylistFolderName", currentPlaylistFolderName);
await SuspensionManager.SaveAsync();

//타입을 입력하고
SuspensionManager.RestoreSetting(typeof(string));
//불러오기 하고
await SuspensionManager.RestoreAsync();
//플레이리스트 파일명과, 폴더명을 가지고 온다.
var filename = SuspensionManager.GetData("CurrentPlaylistFileName") as string;
var foldername = SuspensionManager.GetData("currentPlaylistFolderName") as string;
var songindex = SuspensionManager.GetData("currentSongIndex") as string;

 

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

KMusic Player 0.9 Windows 8 Consumer Preview 버전의 소스를 공개 합니다.

BSD License로 공개하며, 소스 사용에 제한은 없습니다. 수정해서 더 좋은 앱을 만드셔도 좋습니다. 다만 그런 경우에 출처는 표시를 해주시기 바라며, 공부하는 데 도움이 되었으면 좋겠습니다.

공개된 소스의 중요한 부분들에 대해서는 강좌를 포스트 할 예정이며, 이 후에도 이 소스를 기반으로 기능을 추가할 계획이니 블로그에 자주 방문해 주시면 감사하겠습니다.

KMusic Player 0.9 Beta test page
http://kaki104.tistory.com/103

KMusic Player 0.9 Source code
KMusic.zip

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

KMusic Player 베타 테스트를 시작 합니다.

Windows 8 Consumer Preview 에서 제공되는 Music앱을 사용하는 것이 불편해서 만들게 되었습니다. 간단할 줄 알고 시작한 작업이 무지하게 시간이 오래 걸렸네요. 개선할 점이 많은 앱이니, 여러분들의 좋은 의견 부탁드립니다.

** 개발자 라이센스 & 앱 설치 방법 안내 페이지
http://kaki104.tistory.com/entry/Getting-a-developer-license-for-Windows-8-Consumer-Preview

0. 버전 히스토리

0.9.0.1 : 최초 테스트 버전
KMusic_0.9.0.1_AnyCPU_Test.zip

1. 제공 기능

1) Playlist 지원 : 윈도우 플래이 리스트(*.wpl) 파일 열기, 신규생성, 저장, 새이름으로 저장 기능 지원
2) Playlist의 목록 수정 가능
3) Background play 기능 지원
4) 하드웨어 버튼 지원 : (하드웨어가 없어서 테스트는 못했습니다.)
5) Snapped 화면 지원 : 왼쪽이나 오른쪽에 살짝 보이는 형태

2. 화면 설명

1) 시작화면 : 현재 플래이 리스트가 존재하지 않아서 아무것도 보이지 않습니다. 왼쪽 중간에 검은색 줄이 살짝 보였다가 사라짐니다.

 2) 노래 추가 : 앱바(마우스 오른쪽 버튼 클릭)를 호출 한 후 Add 버튼을 클릭합니다.
New : 새로운 Playlist를 만듭니다.
Open : 저장된 Playlist를 불러 옵니다.
Save : 현재 Playlist를 저장 합니다.
SaveAs : 현재 Playlist를 새이름으로 저장 합니다.

Add :  현재 Playlist에 노래를 추가합니다.
Remove : 현재 Playlist에서 노래를 제거 합니다.

 3) 파일 선택 : 컴퓨터의 Music Libraries 폴더가 기본 폴더 입니다. 원하는 폴더를 선택 합니다.

 4) 파일 선택 : 노래를 선택 후 Open을 클릭합니다.

 5) 플래이 : 노래가 선택이 완료되면 Playlist Detail에 노래 제목, 앨범명, 가수 등의 정보가 표시 되면서 플래이 됩니다. 노래를 선택하고 Remove를 누르면 목록에서 제거 됩니다.


6) Snapped 모드 화면 

 

 

3. 작업 예정 내용

1) Playlist를 그룹으로 만들어서 그룹 처럼 관리 할 수 있도록 Playlist 부분 변경 예정

2) 리뷰 http://cafe.naver.com/ei8ht.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=3363&

 감사합니다.

 

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

** 개발자 라이센스 & 앱 설치 방법 안내 페이지
http://kaki104.tistory.com/entry/Getting-a-developer-license-for-Windows-8-Consumer-Preview

1. 제공 기능

1) Playlist 지원 : 윈도우 플래이 리스트(*.wpl) 파일 열기, 신규생성, 저장, 새이름으로 저장 기능 지원
2) Playlist의 목록 수정 가능
3) Background play 기능 지원
4) 하드웨어 버튼 지원 : (하드웨어가 없어서 테스트는 못했습니다.)
5) Snapped 화면 지원 : 왼쪽이나 오른쪽에 살짝 보이는 형태

2. 화면 설명

1) 시작화면 : 현재 플래이 리스트가 존재하지 않아서 아무것도 보이지 않습니다. 왼쪽 중간에 검은색 줄이 살짝 보였다가 사라짐니다.

 2) 노래 추가 : 앱바(마우스 오른쪽 버튼 클릭)를 호출 한 후 Add 버튼을 클릭합니다.
New : 새로운 Playlist를 만듭니다.
Open : 저장된 Playlist를 불러 옵니다.
Save : 현재 Playlist를 저장 합니다.
SaveAs : 현재 Playlist를 새이름으로 저장 합니다.

Add :  현재 Playlist에 노래를 추가합니다.
Remove : 현재 Playlist에서 노래를 제거 합니다.

 3) 파일 선택 : 컴퓨터의 Music Libraries 폴더가 기본 폴더 입니다. 원하는 폴더를 선택 합니다.

 4) 파일 선택 : 노래를 선택 후 Open을 클릭합니다.

 5) 플래이 : 노래가 선택이 완료되면 Playlist Detail에 노래 제목, 앨범명, 가수 등의 정보가 표시 되면서 플래이 됩니다. 노래를 선택하고 Remove를 누르면 목록에서 제거 됩니다.


6) Snapped 모드 화면 

 

 

 

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

차기작으로 뮤직 플레이어를 만들고 있는데..

생각외로 시간이 오래 걸리는 군요..

늦어도 다음 주면 테스트에 들어갈 수 있을 것 같습니다.

즐잠 하세용

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

정말 간단한 것을..모르니 엄청난 삽질을..

1. Music Library 사용 기능 추가
Package.appxmanifest -> Capabilities -> Music Library 체크



2. MainPage.xaml
MediaPlayer 추가

<Page
    x:Class="KMusic.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:KMusic"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid x:Name="ContentRoot" Background="{StaticResource ApplicationPageBackgroundBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="140"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <!-- Back button and page title -->
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Button x:Name="backButton" Style="{StaticResource BackButtonStyle}"/>
            <TextBlock x:Name="pageTitle" Grid.Column="1" Text="KMusic player" Style="{StaticResource PageHeaderTextStyle}"/>
        </Grid>
        <StackPanel Grid.Row="1">
            <StackPanel Orientation="Horizontal">
                <Button x:Name="bAdd" Content="Add Playlist"/>
                <Button x:Name="bPlay" Content="Play Playlist"/>
            </StackPanel>
            <ListBox x:Name="lbPlaylist"/>
            <MediaPlayer x:Name="mp" AutoPlay="True" IsLooping="True"/>
        </StackPanel>
    </Grid>
</Page>

3. MainPage.xaml.cs 

//이벤트 연결

        public MainPage()
        {
            this.InitializeComponent();

            mp.Stop();

            bAdd.Click += bAdd_Click;
            bPlay.Click += bPlay_Click;
        }

//버튼 구현
        async void bAdd_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                //파일 선택 창 오픈
                FileOpenPicker picker = this.CreateFilePicker(MainPage.audioExtensions);
                //파일이 선택되면
                StorageFile file = await picker.PickSingleFileAsync();
                if (file != null)
                {
                    //파일을 열어서 스트림으로 만든다.
                    //Music Library로 등록되어 있는 폴더는 직접 접근 가능, 그 외의 폴더는 접근 불가
                    IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);
                    //미디어 플레이어에 소스로 입력
                    mp.SetSource(stream, file.ContentType);
                }

            }
            catch (ArgumentException)
            {
                //this.OutputStatus.Text = "No audio files were selected.";
            }
        }

4. 더 자세한 사항은 첨부된 소스 참조


5. metro background audio c# (consumer preview)
오디오 서비스를 백그라운드로 실행하는 방법에 대한 포스트
http://babaandthepigman.wordpress.com/2012/03/17/metro-background-audio-c-consumer-preview/

6. media-transport-controls-development
오디오 서비스를 백그라운드로 실행하는 이론 문서

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

티스토리 툴바