UGCKitAudioEffectPanel.m 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Copyright (c) 2019 Tencent. All rights reserved.
  2. #import "UGCKitAudioEffectPanel.h"
  3. @import TCBeautyPanel;
  4. #define L(x) [_theme localizedString:x]
  5. typedef NS_ENUM(NSInteger, AudioEffectMenu) {
  6. AudioEffectMenuVoiceChanger,
  7. AudioEffectMenuMix,
  8. };
  9. @interface UGCKitAudioEffectPanelMenuItem : NSObject <TCMenuItem>
  10. @property (strong, nonatomic) NSString *title;
  11. @property (strong, nonatomic) UIImage *icon;
  12. @property (assign, nonatomic) NSInteger effectID;
  13. + (instancetype)itemWithTitle:(NSString *)title icon:(UIImage *)icon ID:(NSInteger)effectID;
  14. @end
  15. @interface UGCKitAudioEffectPanel() <TCMenuViewDataSource, TCMenuViewDelegate>
  16. {
  17. UGCKitTheme *_theme;
  18. TCMenuView *_menu;
  19. NSArray<NSString *> *_menuArray;
  20. NSArray<UGCKitAudioEffectPanelMenuItem *> *_reverbOptions;
  21. NSArray<UGCKitAudioEffectPanelMenuItem *> *_voiceChangerOptions;
  22. }
  23. @end
  24. @implementation UGCKitAudioEffectPanel
  25. - (instancetype)initWithTheme:(UGCKitTheme*)theme frame:(CGRect)frame {
  26. if (self = [self initWithFrame:frame]) {
  27. _theme = theme;
  28. [self setupView];
  29. }
  30. return self;
  31. }
  32. - (void)setupView {
  33. _voiceChangerOptions = @[
  34. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Origin") icon:_theme.menuDisableIcon ID:VOICECHANGER_TYPE_0],
  35. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Child") icon:_theme.audioEffectVoiceChangerBadBoyIcon ID:VOICECHANGER_TYPE_1],
  36. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Loli") icon:_theme.audioEffectVoiceChangerLoliIcon ID:VOICECHANGER_TYPE_2],
  37. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Uncle") icon:_theme.audioEffectVoiceChangerUncleIcon ID:VOICECHANGER_TYPE_3],
  38. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.HeavyMetal") icon:_theme.audioEffectVoiceChangerHeavyMetalIcon ID:VOICECHANGER_TYPE_4],
  39. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Foreigner") icon:_theme.audioEffectVoiceChangerForeignerIcon ID:VOICECHANGER_TYPE_6],
  40. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Beast") icon:_theme.audioEffectVoiceChangerBeastIcon ID:VOICECHANGER_TYPE_7],
  41. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Fatty") icon:_theme.audioEffectVoiceChangerFattyIcon ID:VOICECHANGER_TYPE_8],
  42. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.StrongCurrent") icon:_theme.audioEffectVoiceChangerElectricIcon ID:VOICECHANGER_TYPE_9],
  43. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.HeavyMachinery") icon:_theme.audioEffectVoiceChangerHeavyMachineryIcon ID:VOICECHANGER_TYPE_10],
  44. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Ethereal") icon:_theme.audioEffectVoiceChangerEtherealIcon ID:VOICECHANGER_TYPE_11]
  45. ];
  46. _reverbOptions = @[
  47. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Origin") icon:_theme.menuDisableIcon ID:REVERB_TYPE_0],
  48. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.KTV") icon:_theme.audioEffectReverbKTVIcon ID:REVERB_TYPE_1],
  49. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Room") icon:_theme.audioEffectReverbRoomIcon ID:REVERB_TYPE_2],
  50. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Hall") icon:_theme.audioEffectReverbHallIcon ID:REVERB_TYPE_3],
  51. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Low") icon:_theme.audioEffectReverbLowIcon ID:REVERB_TYPE_4],
  52. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Bright") icon:_theme.audioEffectReverbSonorousIcon ID:REVERB_TYPE_5],
  53. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Metal") icon:_theme.audioEffectReverbMetalIcon ID:REVERB_TYPE_6],
  54. [UGCKitAudioEffectPanelMenuItem itemWithTitle:L(@"UGCKit.AudioEffect.Magnetic") icon:_theme.audioEffectReverbMagneticIcon ID:REVERB_TYPE_7],
  55. ];
  56. _menuArray = @[[_theme localizedString:@"UGCKit.AudioEffect.Foice"],
  57. [_theme localizedString:@"UGCKit.AudioEffect.Mix"]];
  58. TCMenuView *menu = [[TCMenuView alloc] initWithFrame:self.bounds
  59. dataSource:self];
  60. menu.minSubMenuWidth = 54;
  61. menu.minMenuWidth = 54;
  62. menu.menuTitleColor = _theme.beautyPanelTitleColor;
  63. menu.subMenuSelectionColor = _theme.beautyPanelSelectionColor;
  64. menu.menuSelectionBackgroundImage = _theme.beautyPanelMenuSelectionBackgroundImage;
  65. menu.delegate = self;
  66. [self addSubview:menu];
  67. _menu = menu;
  68. }
  69. - (void)menu:(TCMenuView *)menu didChangeToIndex:(NSInteger)menuIndex option:(NSInteger)optionIndex {
  70. if (menuIndex == AudioEffectMenuVoiceChanger) {
  71. if ([self.delegate respondsToSelector:@selector(audioEffectPanel:didSelectVoiceChangerType:)]) {
  72. [self.delegate audioEffectPanel:self didSelectVoiceChangerType:(TXVideoVoiceChangerType)_voiceChangerOptions[optionIndex].effectID];
  73. }
  74. } else if (menuIndex == AudioEffectMenuMix) {
  75. if ([self.delegate respondsToSelector:@selector(audioEffectPanel:didSelectReverbType:)]) {
  76. [self.delegate audioEffectPanel:self didSelectReverbType:(TXVideoReverbType)_reverbOptions[optionIndex].effectID];
  77. }
  78. }
  79. }
  80. #pragma mark - TCMenuDataSource
  81. - (NSInteger)numberOfMenusInMenu:(TCMenuView *)menu {
  82. return _menuArray.count;
  83. }
  84. - (NSString *)titleOfMenu:(TCMenuView *)menu atIndex:(NSInteger)index {
  85. return _menuArray[index];
  86. }
  87. - (NSUInteger)numberOfOptionsInMenu:(TCMenuView *)menu menuIndex:(NSInteger)index {
  88. return index == AudioEffectMenuVoiceChanger ? _voiceChangerOptions.count : _reverbOptions.count;
  89. }
  90. - (id<TCMenuItem>)menu:(TCMenuView *)menu
  91. itemAtMenuIndex:(NSInteger)index
  92. optionIndex:(NSInteger)optionIndex {
  93. NSArray *container = index == AudioEffectMenuVoiceChanger ? _voiceChangerOptions : _reverbOptions;
  94. return container[optionIndex];
  95. }
  96. @end
  97. @implementation UGCKitAudioEffectPanelMenuItem
  98. + (instancetype)itemWithTitle:(NSString *)title icon:(UIImage *)icon ID:(NSInteger)effectID {
  99. UGCKitAudioEffectPanelMenuItem *item = [[UGCKitAudioEffectPanelMenuItem alloc] init];
  100. item.title = title;
  101. item.icon = icon;
  102. item.effectID = effectID;
  103. return item;
  104. }
  105. @end