audio_stream.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * This file is part of the FreeStreamer project,
  3. * (C)Copyright 2011-2013 Matias Muhonen.
  4. * See the file ''LICENSE'' for using the code.
  5. */
  6. #ifndef ASTREAMER_AUDIO_STREAM_H
  7. #define ASTREAMER_AUDIO_STREAM_H
  8. #import "http_stream.h"
  9. #include "audio_queue.h"
  10. #include <AudioToolbox/AudioToolbox.h>
  11. #include <string>
  12. namespace astreamer {
  13. enum Audio_Stream_Error {
  14. AS_ERR_OPEN = 1, // Cannot open the audio stream
  15. AS_ERR_STREAM_PARSE = 2, // Parse error
  16. AS_ERR_NETWORK = 3 // Network error
  17. };
  18. class Audio_Stream_Delegate;
  19. class Audio_Stream : public HTTP_Stream_Delegate, public Audio_Queue_Delegate {
  20. public:
  21. Audio_Stream_Delegate *m_delegate;
  22. enum State {
  23. STOPPED,
  24. BUFFERING,
  25. PLAYING,
  26. SEEKING,
  27. FAILED,
  28. END_OF_FILE
  29. };
  30. Audio_Stream();
  31. virtual ~Audio_Stream();
  32. void open();
  33. void close();
  34. void pause();
  35. unsigned timePlayedInSeconds();
  36. unsigned durationInSeconds();
  37. void seekToTime(unsigned newSeekTime);
  38. void setUrl(CFURLRef url);
  39. void setStrictContentTypeChecking(bool strictChecking);
  40. void setDefaultContentType(std::string& defaultContentType);
  41. State state();
  42. /* Audio_Queue_Delegate */
  43. void audioQueueStateChanged(Audio_Queue::State state);
  44. void audioQueueBuffersEmpty();
  45. void audioQueueOverflow();
  46. void audioQueueUnderflow();
  47. void audioQueueInitializationFailed();
  48. /* HTTP_Stream_Delegate */
  49. void streamIsReadyRead();
  50. void streamHasBytesAvailable(UInt8 *data, UInt32 numBytes);
  51. void streamEndEncountered();
  52. void streamErrorOccurred();
  53. void streamMetaDataAvailable(std::map<CFStringRef,CFStringRef> metaData);
  54. private:
  55. Audio_Stream(const Audio_Stream&);
  56. Audio_Stream& operator=(const Audio_Stream&);
  57. bool m_httpStreamRunning;
  58. bool m_audioStreamParserRunning;
  59. size_t m_contentLength;
  60. State m_state;
  61. HTTP_Stream *m_httpStream;
  62. Audio_Queue *m_audioQueue;
  63. AudioFileStreamID m_audioFileStream; // the audio file stream parser
  64. SInt64 m_dataOffset;
  65. unsigned m_seekTime;
  66. bool m_strictContentTypeChecking;
  67. std::string m_defaultContentType;
  68. size_t contentLength();
  69. void closeAndSignalError(int error);
  70. void setState(State state);
  71. static void propertyValueCallback(void *inClientData, AudioFileStreamID inAudioFileStream, AudioFileStreamPropertyID inPropertyID, UInt32 *ioFlags);
  72. static void streamDataCallback(void *inClientData, UInt32 inNumberBytes, UInt32 inNumberPackets, const void *inInputData, AudioStreamPacketDescription *inPacketDescriptions);
  73. AudioFileTypeID audioStreamTypeFromContentType(std::string contentType);
  74. };
  75. class Audio_Stream_Delegate {
  76. public:
  77. virtual void audioStreamStateChanged(Audio_Stream::State state) = 0;
  78. virtual void audioStreamErrorOccurred(int errorCode) = 0;
  79. virtual void audioStreamMetaDataAvailable(std::map<CFStringRef,CFStringRef> metaData) = 0;
  80. };
  81. } // namespace astreamer
  82. #endif // ASTREAMER_AUDIO_STREAM_H