text: //
  //  Created by Jesse Squires
  //  http://www.jessesquires.com
  //
  //
  //  Documentation
  //  http://cocoadocs.org/docsets/JSQMessagesViewController
  //
  //
  //  GitHub
  //  https://github.com/jessesquires/JSQMessagesViewController
  //
  //
  //  License
  //  Copyright (c) 2014 Jesse Squires
  //  Released under an MIT license: http://opensource.org/licenses/MIT
  //
  
  #import "JSQMediaItem.h"
  #import "JSQAudioMediaViewAttributes.h"
  
  #import <AVFoundation/AVFoundation.h>
  
  @class JSQAudioMediaItem;
  
  NS_ASSUME_NONNULL_BEGIN
  
  @protocol JSQAudioMediaItemDelegate <NSObject>
  
  /**
   *  Tells the delegate if the specified `JSQAudioMediaItem` changes the sound category or categoryOptions, or if an error occurs.
   */
  - (void)audioMediaItem:(JSQAudioMediaItem *)audioMediaItem
  didChangeAudioCategory:(NSString *)category
                 options:(AVAudioSessionCategoryOptions)options
                   error:(nullable NSError *)error;
  
  @end
  
  
  /**
   *  The `JSQAudioMediaItem` class is a concrete `JSQMediaItem` subclass that implements the `JSQMessageMediaData` protocol
   *  and represents an audio media message. An initialized `JSQAudioMediaItem` object can be passed
   *  to a `JSQMediaMessage` object during its initialization to construct a valid media message object.
   *  You may wish to subclass `JSQAudioMediaItem` to provide additional functionality or behavior.
   */
  @interface JSQAudioMediaItem : JSQMediaItem <JSQMessageMediaData, AVAudioPlayerDelegate, NSCoding, NSCopying>
  
  /**
   *  The delegate object for audio event notifications.
   */
  @property (nonatomic, weak, nullable) id<JSQAudioMediaItemDelegate> delegate;
  
  /**
   *  The view attributes to configure the appearance of the audio media view.
   */
  @property (nonatomic, strong, readonly) JSQAudioMediaViewAttributes *audioViewAttributes;
  
  /**
   *  A data object that contains an audio resource.
   */
  @property (nonatomic, strong, nullable) NSData *audioData;
  
  /**
   *  Initializes and returns a audio media item having the given audioData.
   *
   *  @param audioData              The data object that contains the audio resource.
   *  @param audioViewConfiguration The view attributes to configure the appearance of the audio media view.
   *
   *  @return An initialized `JSQAudioMediaItem`.
   *
   *  @discussion If the audio must be downloaded from the network,
   *  you may initialize a `JSQVideoMediaItem` with a `nil` audioData.
   *  Once the audio is available you can set the `audioData` property.
   */
  - (instancetype)initWithData:(nullable NSData *)audioData
           audioViewAttributes:(JSQAudioMediaViewAttributes *)audioViewAttributes NS_DESIGNATED_INITIALIZER;
  
  /**
   *  Initializes and returns a default audio media item.
   *
   *  @return An initialized `JSQAudioMediaItem`.
   *
   *  @discussion You must set `audioData` to enable the play button.
   */
  - (instancetype)init;
  
  /**
   Initializes and returns a default audio media using the specified view attributes.
  
   @param audioViewAttributes The view attributes to configure the appearance of the audio media view.
  
   @return  An initialized `JSQAudioMediaItem`.
   */
  - (instancetype)initWithAudioViewAttributes:(JSQAudioMediaViewAttributes *)audioViewAttributes;
  
  /**
   *  Initializes and returns an audio media item having the given audioData.
   *
   *  @param audioData The data object that contains the audio resource.
   *
   *  @return An initialized `JSQAudioMediaItem`.
   *
   *  @discussion If the audio must be downloaded from the network,
   *  you may initialize a `JSQAudioMediaItem` with a `nil` audioData.
   *  Once the audio is available you can set the `audioData` property.
   */
  - (instancetype)initWithData:(nullable NSData *)audioData;
  
  /**
   *  Sets or updates the data object in an audio media item with the data specified at audioURL.
   *
   *  @param audioURL A File URL containing the location of the audio data.
   */
  - (void)setAudioDataWithUrl:(nonnull NSURL *)audioURL;
  
  - (void)onPlayButton:(UIButton *)sender;
  @end
  
  NS_ASSUME_NONNULL_END
  