Kodi Development 19.0
for Binary and Script based Add-Ons
AudioDecoder.h
1/*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#pragma once
10
11#include "../AddonBase.h"
12#include "../AudioEngine.h"
13#include "../c-api/addon-instance/audio_decoder.h"
14
15#ifdef __cplusplus
16namespace kodi
17{
18namespace addon
19{
20
21class CInstanceAudioDecoder;
22
23//==============================================================================
37class AudioDecoderInfoTag : public CStructHdl<AudioDecoderInfoTag, AUDIO_DECODER_INFO_TAG>
38{
40 friend class CInstanceAudioDecoder;
43public:
45 AudioDecoderInfoTag() { memset(m_cStructure, 0, sizeof(AUDIO_DECODER_INFO_TAG)); }
73
76
78 void SetTitle(const std::string& title)
79 {
80 strncpy(m_cStructure->title, title.c_str(), sizeof(m_cStructure->title) - 1);
81 }
82
84 std::string GetTitle() const { return m_cStructure->title; }
85
87 void SetArtist(const std::string& artist)
88 {
89 strncpy(m_cStructure->artist, artist.c_str(), sizeof(m_cStructure->artist) - 1);
90 }
91
93 std::string GetArtist() const { return m_cStructure->artist; }
94
96 void SetAlbum(const std::string& album)
97 {
98 strncpy(m_cStructure->album, album.c_str(), sizeof(m_cStructure->album) - 1);
99 }
100
102 std::string GetAlbum() const { return m_cStructure->album; }
103
105 void SetAlbumArtist(const std::string& albumArtist)
106 {
107 strncpy(m_cStructure->album_artist, albumArtist.c_str(),
108 sizeof(m_cStructure->album_artist) - 1);
109 }
110
112 std::string GetAlbumArtist() const { return m_cStructure->album_artist; }
113
124 void SetMediaType(const std::string& mediaType)
125 {
126 strncpy(m_cStructure->media_type, mediaType.c_str(), sizeof(m_cStructure->media_type) - 1);
127 }
128
130 std::string GetMediaType() const { return m_cStructure->media_type; }
131
133 void SetGenre(const std::string& genre)
134 {
135 strncpy(m_cStructure->genre, genre.c_str(), sizeof(m_cStructure->genre) - 1);
136 }
137
139 std::string GetGenre() const { return m_cStructure->genre; }
140
142 void SetDuration(int duration) { m_cStructure->duration = duration; }
143
145 int GetDuration() const { return m_cStructure->duration; }
146
148 void SetTrack(int track) { m_cStructure->track = track; }
149
151 int GetTrack() const { return m_cStructure->track; }
152
154 void SetDisc(int disc) { m_cStructure->disc = disc; }
155
157 int GetDisc() const { return m_cStructure->disc; }
158
160 void SetDiscSubtitle(const std::string& discSubtitle)
161 {
162 strncpy(m_cStructure->disc_subtitle, discSubtitle.c_str(),
163 sizeof(m_cStructure->disc_subtitle) - 1);
164 }
165
167 std::string GetDiscSubtitle() const { return m_cStructure->disc_subtitle; }
168
170 void SetDiscTotal(int discTotal) { m_cStructure->disc_total = discTotal; }
171
173 int GetDiscTotal() const { return m_cStructure->disc_total; }
174
177 void SetReleaseDate(const std::string& releaseDate)
178 {
179 strncpy(m_cStructure->release_date, releaseDate.c_str(),
180 sizeof(m_cStructure->release_date) - 1);
181 }
182
184 std::string GetReleaseDate() const { return m_cStructure->release_date; }
185
187 void SetLyrics(const std::string& lyrics)
188 {
189 strncpy(m_cStructure->lyrics, lyrics.c_str(), sizeof(m_cStructure->lyrics) - 1);
190 }
191
193 std::string GetLyrics() const { return m_cStructure->lyrics; }
194
196 void SetSamplerate(int samplerate) { m_cStructure->samplerate = samplerate; }
197
199 int GetSamplerate() const { return m_cStructure->samplerate; }
200
202 void SetChannels(int channels) { m_cStructure->channels = channels; }
203
205 int GetChannels() const { return m_cStructure->channels; }
206
208 void SetBitrate(int bitrate) { m_cStructure->bitrate = bitrate; }
209
211 int GetBitrate() const { return m_cStructure->bitrate; }
212
214 void SetComment(const std::string& comment)
215 {
216 strncpy(m_cStructure->comment, comment.c_str(), sizeof(m_cStructure->comment) - 1);
217 }
218
220 std::string GetComment() const { return m_cStructure->comment; }
221
223
224private:
226 AudioDecoderInfoTag(AUDIO_DECODER_INFO_TAG* tag) : CStructHdl(tag) {}
227};
229//------------------------------------------------------------------------------
230
231//==============================================================================
241
242//==============================================================================
381class ATTRIBUTE_HIDDEN CInstanceAudioDecoder : public IAddonInstance
382{
383public:
384 //==========================================================================
425 explicit CInstanceAudioDecoder(KODI_HANDLE instance, const std::string& kodiVersion = "")
427 !kodiVersion.empty() ? kodiVersion
429 {
430 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
431 throw std::logic_error("kodi::addon::CInstanceAudioDecoder: Creation of multiple together with single instance way is not allowed!");
432
433 SetAddonStruct(instance);
434 }
435 //--------------------------------------------------------------------------
436
437 //==========================================================================
456 virtual bool Init(const std::string& filename,
457 unsigned int filecache,
458 int& channels,
459 int& samplerate,
460 int& bitspersample,
461 int64_t& totaltime,
462 int& bitrate,
463 AudioEngineDataFormat& format,
464 std::vector<AudioEngineChannel>& channellist) = 0;
465 //--------------------------------------------------------------------------
466
467 //==========================================================================
481 virtual int ReadPCM(uint8_t* buffer, int size, int& actualsize) = 0;
482 //--------------------------------------------------------------------------
483
484 //==========================================================================
491 virtual int64_t Seek(int64_t time) { return time; }
492 //--------------------------------------------------------------------------
493
494 //==========================================================================
506 virtual bool ReadTag(const std::string& file, kodi::addon::AudioDecoderInfoTag& tag)
507 {
508 return false;
509 }
510 //--------------------------------------------------------------------------
511
512 //==========================================================================
519 virtual int TrackCount(const std::string& file) { return 1; }
520 //--------------------------------------------------------------------------
521
522private:
523 void SetAddonStruct(KODI_HANDLE instance)
524 {
525 if (instance == nullptr)
526 throw std::logic_error("kodi::addon::CInstanceAudioDecoder: Creation with empty addon structure not allowed, table must be given from Kodi!");
527
528 m_instanceData = static_cast<AddonInstance_AudioDecoder*>(instance);
529
530 m_instanceData->toAddon->addonInstance = this;
531 m_instanceData->toAddon->init = ADDON_Init;
532 m_instanceData->toAddon->read_pcm = ADDON_ReadPCM;
533 m_instanceData->toAddon->seek = ADDON_Seek;
534 m_instanceData->toAddon->read_tag = ADDON_ReadTag;
535 m_instanceData->toAddon->track_count = ADDON_TrackCount;
536 }
537
538 inline static bool ADDON_Init(const AddonInstance_AudioDecoder* instance,
539 const char* file,
540 unsigned int filecache,
541 int* channels,
542 int* samplerate,
543 int* bitspersample,
544 int64_t* totaltime,
545 int* bitrate,
546 AudioEngineDataFormat* format,
547 const AudioEngineChannel** info)
548 {
549 CInstanceAudioDecoder* thisClass =
550 static_cast<CInstanceAudioDecoder*>(instance->toAddon->addonInstance);
551
552 thisClass->m_channelList.clear();
553 bool ret = thisClass->Init(file, filecache, *channels, *samplerate, *bitspersample, *totaltime,
554 *bitrate, *format, thisClass->m_channelList);
555 if (!thisClass->m_channelList.empty())
556 {
557 if (thisClass->m_channelList.back() != AUDIOENGINE_CH_NULL)
558 thisClass->m_channelList.push_back(AUDIOENGINE_CH_NULL);
559 *info = thisClass->m_channelList.data();
560 }
561 else
562 *info = nullptr;
563 return ret;
564 }
565
566 inline static int ADDON_ReadPCM(const AddonInstance_AudioDecoder* instance, uint8_t* buffer, int size, int* actualsize)
567 {
568 return static_cast<CInstanceAudioDecoder*>(instance->toAddon->addonInstance)
569 ->ReadPCM(buffer, size, *actualsize);
570 }
571
572 inline static int64_t ADDON_Seek(const AddonInstance_AudioDecoder* instance, int64_t time)
573 {
574 return static_cast<CInstanceAudioDecoder*>(instance->toAddon->addonInstance)->Seek(time);
575 }
576
577 inline static bool ADDON_ReadTag(const AddonInstance_AudioDecoder* instance,
578 const char* file,
579 struct AUDIO_DECODER_INFO_TAG* tag)
580 {
582 return static_cast<CInstanceAudioDecoder*>(instance->toAddon->addonInstance)
583 ->ReadTag(file, cppTag);
584 }
585
586 inline static int ADDON_TrackCount(const AddonInstance_AudioDecoder* instance, const char* file)
587 {
588 return static_cast<CInstanceAudioDecoder*>(instance->toAddon->addonInstance)->TrackCount(file);
589 }
590
591 std::vector<AudioEngineChannel> m_channelList;
592 AddonInstance_AudioDecoder* m_instanceData;
593};
594
595} /* namespace addon */
596} /* namespace kodi */
597#endif /* __cplusplus */
Definition: AudioDecoder.h:38
Definition: AudioDecoder.h:382
Definition: AddonBase.h:250
Definition: AddonBase.h:186
@ ADDON_INSTANCE_AUDIODECODER
Audio decoder instance, see kodi::addon::CInstanceAudioDecoder.
Definition: versions.h:216
int GetDisc() const
Get disk number (if present)
Definition: AudioDecoder.h:157
std::string GetAlbum() const
Set album name.
Definition: AudioDecoder.h:102
std::string GetLyrics() const
Get string from lyrics.
Definition: AudioDecoder.h:193
void SetDiscSubtitle(const std::string &discSubtitle)
Set disk subtitle name (if present) from music info.
Definition: AudioDecoder.h:160
std::string GetDiscSubtitle() const
Get disk subtitle name (if present) from music info.
Definition: AudioDecoder.h:167
void SetAlbum(const std::string &album)
Set album name.
Definition: AudioDecoder.h:96
std::string GetMediaType() const
Get the media type of the music item.
Definition: AudioDecoder.h:130
void SetComment(const std::string &comment)
Set additional information comment (if present).
Definition: AudioDecoder.h:214
std::string GetArtist() const
Get artist name.
Definition: AudioDecoder.h:93
void SetMediaType(const std::string &mediaType)
Set the media type of the music item.
Definition: AudioDecoder.h:124
void SetDuration(int duration)
Set the duration of music as integer from info.
Definition: AudioDecoder.h:142
void SetLyrics(const std::string &lyrics)
Set string from lyrics.
Definition: AudioDecoder.h:187
std::string GetAlbumArtist() const
Get album artist name.
Definition: AudioDecoder.h:112
void SetDiscTotal(int discTotal)
Set disks amount quantity (if present) from music info as integer.
Definition: AudioDecoder.h:170
std::string GetComment() const
Get additional information comment (if present).
Definition: AudioDecoder.h:220
void SetBitrate(int bitrate)
Set related stream bitrate.
Definition: AudioDecoder.h:208
void SetTitle(const std::string &title)
Set the title from music as string on info tag.
Definition: AudioDecoder.h:78
void SetDisc(int disc)
Set disk number (if present) from music info as integer.
Definition: AudioDecoder.h:154
void SetArtist(const std::string &artist)
Set artist name.
Definition: AudioDecoder.h:87
std::string GetGenre() const
Get genre name from music as string if present.
Definition: AudioDecoder.h:139
void SetAlbumArtist(const std::string &albumArtist)
Set album artist name.
Definition: AudioDecoder.h:105
void SetChannels(int channels)
Set related stream channels amount.
Definition: AudioDecoder.h:202
std::string GetTitle() const
Get title name.
Definition: AudioDecoder.h:84
int GetDuration() const
Get the duration of music as integer from info.
Definition: AudioDecoder.h:145
void SetTrack(int track)
Set track number (if present) from music info as integer.
Definition: AudioDecoder.h:148
int GetBitrate() const
Get related stream bitrate.
Definition: AudioDecoder.h:211
void SetReleaseDate(const std::string &releaseDate)
Set release date as string from music info (if present). ISO8601 date YYYY, YYYY-MM or YYYY-MM-DD.
Definition: AudioDecoder.h:177
void SetSamplerate(int samplerate)
Set related stream samplerate.
Definition: AudioDecoder.h:196
int GetDiscTotal() const
Get disks amount quantity (if present)
Definition: AudioDecoder.h:173
std::string GetReleaseDate() const
Get release date as string from music info (if present).
Definition: AudioDecoder.h:184
int GetTrack() const
Get track number (if present).
Definition: AudioDecoder.h:151
void SetGenre(const std::string &genre)
Set genre name from music as string if present.
Definition: AudioDecoder.h:133
int GetChannels() const
Get related stream channels amount.
Definition: AudioDecoder.h:205
int GetSamplerate() const
Get related stream samplerate.
Definition: AudioDecoder.h:199
virtual int ReadPCM(uint8_t *buffer, int size, int &actualsize)=0
Produce some noise.
virtual bool ReadTag(const std::string &file, kodi::addon::AudioDecoderInfoTag &tag)
Read tag of a file.
Definition: AudioDecoder.h:506
virtual int64_t Seek(int64_t time)
Seek in output stream.
Definition: AudioDecoder.h:491
CInstanceAudioDecoder(KODI_HANDLE instance, const std::string &kodiVersion="")
Audio decoder class constructor used to support multiple instance types.
Definition: AudioDecoder.h:425
virtual bool Init(const std::string &filename, unsigned int filecache, int &channels, int &samplerate, int &bitspersample, int64_t &totaltime, int &bitrate, AudioEngineDataFormat &format, std::vector< AudioEngineChannel > &channellist)=0
Initialize a decoder.
virtual int TrackCount(const std::string &file)
Get number of tracks in a file.
Definition: AudioDecoder.h:519
AudioEngineChannel
Definition: audio_engine.h:70
@ AUDIOENGINE_CH_NULL
Used inside to indicate the end of a list and not for addon use directly.
Definition: audio_engine.h:72
AudioEngineDataFormat
Definition: audio_engine.h:148
std::string ATTRIBUTE_HIDDEN GetKodiTypeVersion(int type)
To get used version inside Kodi itself about asked type.
Definition: AddonBase.h:630
Definition: audio_decoder.h:24
Definition: audio_decoder.h:80