/*
 IMPORTANT:  This Apple software is supplied to you by Apple Inc. ("Apple") in
 consideration of your agreement to the following terms, and your use, installation,
 modification or redistribution of this Apple software constitutes acceptance of these
 terms.  If you do not agree with these terms, please do not use, install, modify or
 redistribute this Apple software.

 In consideration of your agreement to abide by the following terms, and subject to these
 terms, Apple grants you a personal, non-exclusive license, under Apple’s copyrights in
 this original Apple software (the "Apple Software"), to use, reproduce, modify and
 redistribute the Apple Software, with or without modifications, in source and/or binary
 forms; provided that if you redistribute the Apple Software in its entirety and without
 modifications, you must retain this notice and the following text and disclaimers in all
 such redistributions of the Apple Software.  Neither the name, trademarks, service marks
 or logos of Apple Inc. may be used to endorse or promote products derived from
 the Apple Software without specific prior written permission from Apple. Except as expressly
 stated in this notice, no other rights or licenses, express or implied, are granted by Apple
 herein, including but not limited to any patent rights that may be infringed by your
 derivative works or by other works in which the Apple Software may be incorporated.

 The Apple Software is provided by Apple on an "AS IS" basis.  APPLE MAKES NO WARRANTIES,
 EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT,
 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS
 USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.

 IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE,
 REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND
 WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR
 OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#import "AudioPlayer.h"

#import <AVFoundation/AVFoundation.h>

static void *itemStatusKVOContext = &itemStatusKVOContext;

@implementation AudioPlayer

@synthesize audioPlayerDelegate=_audioPlayerDelegate;

- (instancetype)initWithURL:(NSURL *)url
{
    if (!url.absoluteString.length)
        return nil;

    if (!(self = [super init]))
        return nil;

    AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil];
    _playerItem = [[AVPlayerItem alloc] initWithAsset:avAsset];
    [_playerItem addObserver:self forKeyPath:@"status" options:0 context:itemStatusKVOContext];
    _audioPlayer = [[AVPlayer alloc] initWithPlayerItem:_playerItem];

    return self;
}

- (void)dealloc
{
    [_playerItem removeObserver:self forKeyPath:@"status"];
    [_audioPlayer release];
    [_playerItem release];
    [super dealloc];
}

- (BOOL)isReadyToPlay
{
    return _audioPlayer.currentItem.status == AVPlayerItemStatusReadyToPlay;
}

- (BOOL)isPlaying
{
    return _playing;
}

- (void)setPlaying:(BOOL)playing
{
    if (_playing == playing)
        return;

    if (playing && !self.isReadyToPlay)
        return;

    _playing = playing;

    if (_playing)
        [_audioPlayer play];
    else
        [_audioPlayer pause];

    [_audioPlayerDelegate playStateDidChangeForAudioPlayer:self];
}

- (BOOL)isMuted
{
    return _audioPlayer.isMuted;
}

- (void)setMuted:(BOOL)muted
{
    if (self.isMuted == muted)
        return;

    _audioPlayer.muted = muted;
    [_audioPlayerDelegate mutedStateDidChangeForAudioPlayer:self];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if (context == &itemStatusKVOContext) {
        dispatch_async(dispatch_get_main_queue(), ^{ [_audioPlayerDelegate readyStateDidChangeForAudioPlayer:self]; });
        return;
    }
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
@end
