VLCRendererDiscoverer.m 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*****************************************************************************
  2. * VLCRendererDiscoverer.m
  3. *****************************************************************************
  4. * Copyright © 2018 VLC authors, VideoLAN
  5. * Copyright © 2018 Videolabs
  6. *
  7. * Authors: Soomin Lee<bubu@mikan.io>
  8. *
  9. * This program is free software; you can redistribute it and/or modify it
  10. * under the terms of the GNU Lesser General Public License as published by
  11. * the Free Software Foundation; either version 2.1 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public License
  20. * along with this program; if not, write to the Free Software Foundation,
  21. * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22. *****************************************************************************/
  23. #import "VLCRendererDiscoverer.h"
  24. #import "VLCLibrary.h"
  25. #import "VLCEventManager.h"
  26. #import "VLCRendererItem+Init.h"
  27. @interface VLCRendererDiscoverer()
  28. {
  29. libvlc_renderer_discoverer_t *_rendererDiscoverer;
  30. }
  31. @end
  32. #pragma mark - LibVLC event callbacks
  33. static void HandleRendererDiscovererItemAdded(const libvlc_event_t *event, void *self)
  34. {
  35. @autoreleasepool {
  36. [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
  37. withMethod:@selector(itemAdded:)
  38. withArgumentAsObject:[[VLCRendererItem alloc] initWithCItem:
  39. event->u.renderer_discoverer_item_added.item]];
  40. }
  41. }
  42. static void HandleRendererDiscovererItemDeleted(const libvlc_event_t *event, void *self)
  43. {
  44. @autoreleasepool {
  45. [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
  46. withMethod:@selector(itemDeleted:)
  47. withArgumentAsObject:[[VLCRendererItem alloc] initWithCItem:
  48. event->u.renderer_discoverer_item_deleted.item]];
  49. }
  50. }
  51. #pragma mark - VLCRendererDiscovererDescription
  52. @implementation VLCRendererDiscovererDescription
  53. - (instancetype)initWithName:(NSString *)name longName:(NSString *)longName
  54. {
  55. self = [super init];
  56. if (self) {
  57. NSAssert(!name, @"VLCRendererDiscovererDescription: name is NULL");
  58. _name = name;
  59. NSAssert(!longName, @"VLCRendererDiscovererDescription: longName is NULL");
  60. _longName = longName;
  61. }
  62. return self;
  63. }
  64. @end
  65. #pragma mark - VLCRendererDiscoverer
  66. @implementation VLCRendererDiscoverer
  67. - (instancetype)initWithName:(NSString *)name
  68. {
  69. self = [super init];
  70. if (self) {
  71. _rendererDiscoverer = libvlc_renderer_discoverer_new([VLCLibrary sharedLibrary].instance, [name UTF8String]);
  72. if (!_rendererDiscoverer) {
  73. NSAssert(_rendererDiscoverer, @"Failed to create renderer with name %@", name);
  74. return nil;
  75. }
  76. libvlc_event_manager_t *p_em = libvlc_renderer_discoverer_event_manager(_rendererDiscoverer);
  77. if (p_em) {
  78. libvlc_event_attach(p_em, libvlc_RendererDiscovererItemAdded,
  79. HandleRendererDiscovererItemAdded, (__bridge void *)(self));
  80. libvlc_event_attach(p_em, libvlc_RendererDiscovererItemDeleted,
  81. HandleRendererDiscovererItemDeleted, (__bridge void *)(self));
  82. }
  83. }
  84. return self;
  85. }
  86. - (BOOL)start
  87. {
  88. return libvlc_renderer_discoverer_start(_rendererDiscoverer) == 0;
  89. }
  90. - (void)stop
  91. {
  92. libvlc_renderer_discoverer_stop(_rendererDiscoverer);
  93. }
  94. - (void)dealloc
  95. {
  96. libvlc_event_manager_t *p_em = libvlc_renderer_discoverer_event_manager(_rendererDiscoverer);
  97. if (p_em) {
  98. libvlc_event_detach(p_em, libvlc_RendererDiscovererItemAdded,
  99. HandleRendererDiscovererItemAdded, (__bridge void *)(self));
  100. libvlc_event_detach(p_em, libvlc_RendererDiscovererItemDeleted,
  101. HandleRendererDiscovererItemDeleted, (__bridge void *)(self));
  102. }
  103. if (_rendererDiscoverer) {
  104. libvlc_renderer_discoverer_release(_rendererDiscoverer);
  105. }
  106. }
  107. + (NSArray<VLCRendererDiscovererDescription *> *)list
  108. {
  109. size_t i_nb_services = 0;
  110. libvlc_rd_description_t **pp_services = NULL;
  111. i_nb_services = libvlc_renderer_discoverer_list_get([VLCLibrary sharedLibrary].instance, &pp_services);
  112. if (i_nb_services == 0) {
  113. return NULL;
  114. }
  115. NSMutableArray *list;
  116. for (size_t i = 0; i < i_nb_services; ++i) {
  117. [list addObject:[[VLCRendererDiscovererDescription alloc] initWithName:[NSString stringWithUTF8String:pp_services[i]->psz_name]
  118. longName:[NSString stringWithUTF8String:pp_services[i]->psz_longname]]];
  119. }
  120. if (pp_services) {
  121. libvlc_renderer_discoverer_list_release(pp_services, i_nb_services);
  122. }
  123. return [list copy];
  124. }
  125. #pragma mark - Handling libvlc event callbacks
  126. - (void)itemAdded:(VLCRendererItem *)item
  127. {
  128. if ([_delegate respondsToSelector:@selector(rendererDiscovererItemAdded:)]) {
  129. [_delegate rendererDiscovererItemAdded:self item:item];
  130. }
  131. }
  132. - (void)itemDeleted:(VLCRendererItem *)item
  133. {
  134. if ([_delegate respondsToSelector:@selector(rendererDiscovererItemDeleted:)]) {
  135. [_delegate rendererDiscovererItemDeleted:self item:item];
  136. }
  137. }
  138. @end