vlc | branch: master | Felix Paul Kühne <[email protected]> | Mon Jun 3 13:26:34 2019 +0200| [aacd3dffb087498ecfd57eddeb360915b2521b37] | committer: Felix Paul Kühne
macosx/open: split single worker method into maintainable parts and optimize > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=aacd3dffb087498ecfd57eddeb360915b2521b37 --- modules/gui/macosx/extensions/NSString+Helpers.h | 7 + modules/gui/macosx/extensions/NSString+Helpers.m | 22 + .../gui/macosx/windows/VLCOpenWindowController.h | 1 - .../gui/macosx/windows/VLCOpenWindowController.m | 464 +++++++++++---------- 4 files changed, 278 insertions(+), 216 deletions(-) diff --git a/modules/gui/macosx/extensions/NSString+Helpers.h b/modules/gui/macosx/extensions/NSString+Helpers.h index 2fc405851c..ddea76a610 100644 --- a/modules/gui/macosx/extensions/NSString+Helpers.h +++ b/modules/gui/macosx/extensions/NSString+Helpers.h @@ -109,6 +109,13 @@ NSImage *imageFromRes(NSString *name); + (instancetype)stringWithTimeFromTicks:(vlc_tick_t)time; /** + Returns a time in seconds from strings formatted with colons (aka ##, ##:##, ##:##:##) + + \param aString the string to parse + */ ++ (NSInteger)timeInSecondsFromStringWithColons:(NSString *)aString; + +/** Creates an NSString from the given null-terminated C string buffer encoded as base64 diff --git a/modules/gui/macosx/extensions/NSString+Helpers.m b/modules/gui/macosx/extensions/NSString+Helpers.m index 44e142d39c..cbb3cbb31d 100644 --- a/modules/gui/macosx/extensions/NSString+Helpers.m +++ b/modules/gui/macosx/extensions/NSString+Helpers.m @@ -113,6 +113,28 @@ NSString *const kVLCMediaUnknown = @"Unknown"; } } ++ (NSInteger)timeInSecondsFromStringWithColons:(NSString *)aString +{ + NSArray *components = [aString componentsSeparatedByString:@":"]; + NSUInteger componentCount = [components count]; + NSInteger returnValue = 0; + switch (componentCount) { + case 3: + returnValue = [[components firstObject] intValue] * 3600 + [[components objectAtIndex:1] intValue] * 60 + [[components objectAtIndex:2] intValue]; + break; + + case 2: + returnValue = [[components firstObject] intValue] * 60 + [[components objectAtIndex:1] intValue]; + break; + + default: + returnValue = [[components firstObject] intValue]; + break; + } + + return returnValue; +} + + (instancetype)base64StringWithCString:(const char *)cstring { if (cstring == NULL) diff --git a/modules/gui/macosx/windows/VLCOpenWindowController.h b/modules/gui/macosx/windows/VLCOpenWindowController.h index 66fb276590..c103167869 100644 --- a/modules/gui/macosx/windows/VLCOpenWindowController.h +++ b/modules/gui/macosx/windows/VLCOpenWindowController.h @@ -187,7 +187,6 @@ @property (nonatomic) float fileSubFps; - (IBAction)outputSettings:(id)sender; -- (void)setSubPanel; - (void)tabView:(NSTabView *)o_tv didSelectTabViewItem:(NSTabViewItem *)o_tvi; - (void)textFieldWasClicked:(NSNotification *)o_notification; - (IBAction)expandMRLfieldAction:(id)sender; diff --git a/modules/gui/macosx/windows/VLCOpenWindowController.m b/modules/gui/macosx/windows/VLCOpenWindowController.m index 1c3884655f..a25f103180 100644 --- a/modules/gui/macosx/windows/VLCOpenWindowController.m +++ b/modules/gui/macosx/windows/VLCOpenWindowController.m @@ -120,6 +120,67 @@ static NSString *kCaptureTabViewId = @"capture"; [self.window setCollectionBehavior: NSWindowCollectionBehaviorFullScreenAuxiliary]; + [self initStrings]; + + // setup start / stop time fields + [_fileStartTimeTextField setFormatter:[[VLCPositionFormatter alloc] init]]; + [_fileStopTimeTextField setFormatter:[[VLCPositionFormatter alloc] init]]; + + // Auto collapse MRL field + self.mrlViewHeightConstraint.constant = 0; + + [self updateVideoDevicesAndRepresentation]; + + [self updateAudioDevicesAndRepresentation]; + + [self setupSubtitlesPanel]; + + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver: self + selector: @selector(openNetInfoChanged:) + name: NSControlTextDidChangeNotification + object: _netUDPPortTextField]; + [notificationCenter addObserver: self + selector: @selector(openNetInfoChanged:) + name: NSControlTextDidChangeNotification + object: _netUDPMAddressTextField]; + [notificationCenter addObserver: self + selector: @selector(openNetInfoChanged:) + name: NSControlTextDidChangeNotification + object: _netUDPMPortTextField]; + [notificationCenter addObserver: self + selector: @selector(openNetInfoChanged:) + name: NSControlTextDidChangeNotification + object: _netHTTPURLTextField]; + + [notificationCenter addObserver: self + selector: @selector(screenFPSfieldChanged:) + name: NSControlTextDidChangeNotification + object: _screenFPSTextField]; + + /* register clicks on text fields */ + [notificationCenter addObserver: self + selector: @selector(textFieldWasClicked:) + name: VLCOpenTextFieldWasClicked + object: nil]; + + /* we want to be notified about removed or added media */ + _allMediaDevices = [[NSMutableArray alloc] init]; + _specialMediaFolders = [[NSMutableArray alloc] init]; + _displayInfos = [[NSMutableArray alloc] init]; + NSNotificationCenter *sharedNotificationCenter = [[NSWorkspace sharedWorkspace] notificationCenter]; + [sharedNotificationCenter addObserver:self selector:@selector(scanOpticalMedia:) name:NSWorkspaceDidMountNotification object:nil]; + [sharedNotificationCenter addObserver:self selector:@selector(scanOpticalMedia:) name:NSWorkspaceDidUnmountNotification object:nil]; + + [self qtkToggleUIElements:nil]; + [self updateMediaSelector:nil]; + [self scanOpticalMedia:nil]; + + [self setMRL: @""]; +} + +- (void)initStrings +{ [self.window setTitle: _NS("Open Source")]; [_mrlButtonLabel setTitle: _NS("Media Resource Locator (MRL)")]; @@ -206,135 +267,56 @@ static NSString *kCaptureTabViewId = @"capture"; [_screenHeightLabel setStringValue: [NSString stringWithFormat:@"%@:",_NS("Subscreen Height")]]; [_screenFollowMouseCheckbox setTitle: _NS("Follow the mouse")]; [_screenqtkAudioCheckbox setTitle: _NS("Capture Audio")]; +} - // setup start / stop time fields - [_fileStartTimeTextField setFormatter:[[VLCPositionFormatter alloc] init]]; - [_fileStopTimeTextField setFormatter:[[VLCPositionFormatter alloc] init]]; - - // Auto collapse MRL field - self.mrlViewHeightConstraint.constant = 0; +- (void)setupSubtitlesPanel +{ + int i_index; + module_config_t * p_item; - [self updateVideoDevices]; - [_qtkVideoDevicePopup removeAllItems]; - msg_Dbg(getIntf(), "Found %lu video capture devices", _avvideoDevices.count); + [self initSubtitlesPanelStrings]; - if (_avvideoDevices.count >= 1) { - if (!_avCurrentDeviceUID) - _avCurrentDeviceUID = [[[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] uniqueID] - stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + [[_fileSubDelayTextField formatter] setFormat:[NSString stringWithFormat:@"#,##0.000 %@", _NS("s")]]; + [[_fileSubFPSTextField formatter] setFormat:[NSString stringWithFormat:@"#,##0.000 %@", _NS("fps")]]; + self.fileSubFps = 1.0; - NSUInteger deviceCount = _avvideoDevices.count; - for (int ivideo = 0; ivideo < deviceCount; ivideo++) { - AVCaptureDevice *avDevice = [_avvideoDevices objectAtIndex:ivideo]; - // allow same name for multiple times - [[_qtkVideoDevicePopup menu] addItemWithTitle:[avDevice localizedName] action:nil keyEquivalent:@""]; + p_item = config_FindConfig("subsdec-encoding"); - if ([[[avDevice uniqueID] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] isEqualToString:_avCurrentDeviceUID]) - [_qtkVideoDevicePopup selectItemAtIndex:ivideo]; + if (p_item) { + for (int i = 0; i < p_item->list_count; i++) { + [_fileSubEncodingPopup addItemWithTitle: _NS(p_item->list_text[i])]; + [[_fileSubEncodingPopup lastItem] setRepresentedObject:[NSString stringWithFormat:@"%s", p_item->list.psz[i]]]; + if (p_item->value.psz && !strcmp(p_item->value.psz, p_item->list.psz[i])) + [_fileSubEncodingPopup selectItem: [_fileSubEncodingPopup lastItem]]; } - } else { - [_qtkVideoDevicePopup addItemWithTitle: _NS("None")]; + + if ([_fileSubEncodingPopup indexOfSelectedItem] < 0) + [_fileSubEncodingPopup selectItemAtIndex:0]; } - [_qtkAudioDevicePopup removeAllItems]; - [_screenqtkAudioPopup removeAllItems]; + p_item = config_FindConfig("subsdec-align"); - [self updateAudioDevices]; - msg_Dbg(getIntf(), "Found %lu audio capture devices", _avaudioDevices.count); + if (p_item) { + for (i_index = 0; i_index < p_item->list_count; i_index++) + [_fileSubAlignPopup addItemWithTitle: _NS(p_item->list_text[i_index])]; - if (_avaudioDevices.count >= 1) { - if (!_avCurrentAudioDeviceUID) - _avCurrentAudioDeviceUID = [[[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio] uniqueID] - stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + [_fileSubAlignPopup selectItemAtIndex: p_item->value.i]; + } - NSUInteger deviceCount = _avaudioDevices.count; - for (int iaudio = 0; iaudio < deviceCount; iaudio++) { - AVCaptureDevice *avAudioDevice = [_avaudioDevices objectAtIndex:iaudio]; + p_item = config_FindConfig("freetype-rel-fontsize"); - // allow same name for multiple times - NSString *localizedName = [avAudioDevice localizedName]; - [[_qtkAudioDevicePopup menu] addItemWithTitle:localizedName action:nil keyEquivalent:@""]; - [[_screenqtkAudioPopup menu] addItemWithTitle:localizedName action:nil keyEquivalent:@""]; + if (p_item) { + for (i_index = 0; i_index < p_item->list_count; i_index++) { + [_fileSubSizePopup addItemWithTitle: _NS(p_item->list_text[i_index])]; - if ([[[avAudioDevice uniqueID] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] isEqualToString:_avCurrentAudioDeviceUID]) { - [_qtkAudioDevicePopup selectItemAtIndex:iaudio]; - [_screenqtkAudioPopup selectItemAtIndex:iaudio]; - } + if (p_item->value.i == p_item->list.i[i_index]) + [_fileSubSizePopup selectItemAtIndex: i_index]; } - } else { - [_qtkAudioDevicePopup addItemWithTitle: _NS("None")]; - [_screenqtkAudioPopup addItemWithTitle: _NS("None")]; } - - [self setSubPanel]; - - NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; - [notificationCenter addObserver: self - selector: @selector(openNetInfoChanged:) - name: NSControlTextDidChangeNotification - object: _netUDPPortTextField]; - [notificationCenter addObserver: self - selector: @selector(openNetInfoChanged:) - name: NSControlTextDidChangeNotification - object: _netUDPMAddressTextField]; - [notificationCenter addObserver: self - selector: @selector(openNetInfoChanged:) - name: NSControlTextDidChangeNotification - object: _netUDPMPortTextField]; - [notificationCenter addObserver: self - selector: @selector(openNetInfoChanged:) - name: NSControlTextDidChangeNotification - object: _netHTTPURLTextField]; - - [notificationCenter addObserver: self - selector: @selector(screenFPSfieldChanged:) - name: NSControlTextDidChangeNotification - object: _screenFPSTextField]; - - /* register clicks on text fields */ - [notificationCenter addObserver: self - selector: @selector(textFieldWasClicked:) - name: VLCOpenTextFieldWasClicked - object: nil]; - - /* we want to be notified about removed or added media */ - _allMediaDevices = [[NSMutableArray alloc] init]; - _specialMediaFolders = [[NSMutableArray alloc] init]; - _displayInfos = [[NSMutableArray alloc] init]; - NSNotificationCenter *sharedNotificationCenter = [[NSWorkspace sharedWorkspace] notificationCenter]; - [sharedNotificationCenter addObserver:self selector:@selector(scanOpticalMedia:) name:NSWorkspaceDidMountNotification object:nil]; - [sharedNotificationCenter addObserver:self selector:@selector(scanOpticalMedia:) name:NSWorkspaceDidUnmountNotification object:nil]; - - [self qtkToggleUIElements:nil]; - [self updateMediaSelector:nil]; - [self scanOpticalMedia:nil]; - - [self setMRL: @""]; } -- (void)setMRL:(NSString *)newMRL +- (void)initSubtitlesPanelStrings { - if (!newMRL) - newMRL = @""; - - _MRL = newMRL; - [self.mrlTextField performSelectorOnMainThread:@selector(setStringValue:) withObject:_MRL waitUntilDone:NO]; - if ([_MRL length] > 0) - [_okButton setEnabled: YES]; - else - [_okButton setEnabled: NO]; -} - -- (NSString *)MRL -{ - return _MRL; -} - -- (void)setSubPanel -{ - int i_index; - module_config_t * p_item; - [_fileSubCheckbox setTitle: _NS("Add Subtitle File:")]; [_fileSubPathLabel setStringValue: _NS("Choose a file")]; [_fileSubPathLabel setHidden: NO]; @@ -359,46 +341,31 @@ static NSString *kCaptureTabViewId = @"capture"; _fileSubOKButton.accessibilityLabel = _NS("Dismiss the subtitle setup dialog"); [_fileSubFontBox setTitle: _NS("Font Properties")]; [_fileSubFileBox setTitle: _NS("Subtitle File")]; +} - [[_fileSubDelayTextField formatter] setFormat:[NSString stringWithFormat:@"#,##0.000 %@", _NS("s")]]; - [[_fileSubFPSTextField formatter] setFormat:[NSString stringWithFormat:@"#,##0.000 %@", _NS("fps")]]; - self.fileSubFps = 1.0; - - p_item = config_FindConfig("subsdec-encoding"); - - if (p_item) { - for (int i = 0; i < p_item->list_count; i++) { - [_fileSubEncodingPopup addItemWithTitle: _NS(p_item->list_text[i])]; - [[_fileSubEncodingPopup lastItem] setRepresentedObject:[NSString stringWithFormat:@"%s", p_item->list.psz[i]]]; - if (p_item->value.psz && !strcmp(p_item->value.psz, p_item->list.psz[i])) - [_fileSubEncodingPopup selectItem: [_fileSubEncodingPopup lastItem]]; - } - - if ([_fileSubEncodingPopup indexOfSelectedItem] < 0) - [_fileSubEncodingPopup selectItemAtIndex:0]; - } - - p_item = config_FindConfig("subsdec-align"); - - if (p_item) { - for (i_index = 0; i_index < p_item->list_count; i_index++) - [_fileSubAlignPopup addItemWithTitle: _NS(p_item->list_text[i_index])]; +#pragma mark - property handling - [_fileSubAlignPopup selectItemAtIndex: p_item->value.i]; - } - - p_item = config_FindConfig("freetype-rel-fontsize"); +- (void)setMRL:(NSString *)newMRL +{ + if (!newMRL) + newMRL = @""; - if (p_item) { - for (i_index = 0; i_index < p_item->list_count; i_index++) { - [_fileSubSizePopup addItemWithTitle: _NS(p_item->list_text[i_index])]; + _MRL = newMRL; + [self.mrlTextField performSelectorOnMainThread:@selector(setStringValue:) withObject:_MRL waitUntilDone:NO]; + if ([_MRL length] > 0) + [_okButton setEnabled: YES]; + else + [_okButton setEnabled: NO]; +} - if (p_item->value.i == p_item->list.i[i_index]) - [_fileSubSizePopup selectItemAtIndex: i_index]; - } - } +- (NSString *)MRL +{ + return _MRL; } +#pragma mark - +#pragma mark Main Actions + - (void)openTarget:(NSString *)identifier { /* check whether we already run a modal dialog */ @@ -418,86 +385,32 @@ static NSString *kCaptureTabViewId = @"capture"; if (i_result <= 0) return; + [self fetchMRLcreateOptionsAndStartPlayback]; +} + +- (void)fetchMRLcreateOptionsAndStartPlayback +{ NSMutableArray *options = [NSMutableArray array]; VLCOpenInputMetadata *inputMetadata = [[VLCOpenInputMetadata alloc] init]; inputMetadata.MRLString = [self MRL]; if ([_fileSubCheckbox state] == NSOnState) { - module_config_t * p_item; - - [options addObject: [NSString stringWithFormat: @"sub-file=%@", _subPath]]; - if ([_fileSubOverrideCheckbox state] == NSOnState) { - [options addObject: [NSString stringWithFormat: @"sub-delay=%f", ([self fileSubDelay] * 10)]]; - [options addObject: [NSString stringWithFormat: @"sub-fps=%f", [self fileSubFps]]]; - } - [options addObject: [NSString stringWithFormat: - @"subsdec-encoding=%@", [[_fileSubEncodingPopup selectedItem] representedObject]]]; - [options addObject: [NSString stringWithFormat: - @"subsdec-align=%li", [_fileSubAlignPopup indexOfSelectedItem]]]; - - p_item = config_FindConfig("freetype-rel-fontsize"); - - if (p_item) { - [options addObject: [NSString stringWithFormat: - @"freetype-rel-fontsize=%i", - p_item->list.i[[_fileSubSizePopup indexOfSelectedItem]]]]; - } + [self addSubtitleOptionsToArray:options]; } if ([_fileCustomTimingCheckbox state] == NSOnState) { - NSArray *components = [[_fileStartTimeTextField stringValue] componentsSeparatedByString:@":"]; - NSUInteger componentCount = [components count]; - NSInteger tempValue = 0; - if (componentCount == 1) - tempValue = [[components firstObject] intValue]; - else if (componentCount == 2) - tempValue = [[components firstObject] intValue] * 60 + [[components objectAtIndex:1] intValue]; - else if (componentCount == 3) - tempValue = [[components firstObject] intValue] * 3600 + [[components objectAtIndex:1] intValue] * 60 + [[components objectAtIndex:2] intValue]; - if (tempValue > 0) - [options addObject: [NSString stringWithFormat:@"start-time=%li", tempValue]]; - components = [[_fileStopTimeTextField stringValue] componentsSeparatedByString:@":"]; - componentCount = [components count]; - if (componentCount == 1) - tempValue = [[components firstObject] intValue]; - else if (componentCount == 2) - tempValue = [[components firstObject] intValue] * 60 + [[components objectAtIndex:1] intValue]; - else if (componentCount == 3) - tempValue = [[components firstObject] intValue] * 3600 + [[components objectAtIndex:1] intValue] * 60 + [[components objectAtIndex:2] intValue]; - if (tempValue != 0) - [options addObject: [NSString stringWithFormat:@"stop-time=%li", tempValue]]; + [self addTimingOptionsToArray:options]; } if ([_outputCheckbox state] == NSOnState) { - NSArray *soutMRL = [_output soutMRL]; - NSUInteger count = [soutMRL count]; - for (NSUInteger i = 0 ; i < count ; i++) - [options addObject: [NSString stringWithString: [soutMRL objectAtIndex:i]]]; + [self addStreamOutputOptionsToArray:options]; } if ([_fileSlaveCheckbox state] && _fileSlavePath) [options addObject: [NSString stringWithFormat: @"input-slave=%@", _fileSlavePath]]; if ([[[_tabView selectedTabViewItem] identifier] isEqualToString: kCaptureTabViewId]) { if ([[[_captureModePopup selectedItem] title] isEqualToString: _NS("Screen")]) { - NSInteger selected_index = [_screenPopup indexOfSelectedItem]; - NSValue *v = [_displayInfos objectAtIndex:selected_index]; - struct display_info_t *item = (struct display_info_t *)[v pointerValue]; - - [options addObject: [NSString stringWithFormat: @"screen-fps=%f", [_screenFPSTextField floatValue]]]; - [options addObject: [NSString stringWithFormat: @"screen-display-id=%i", item->id]]; - [options addObject: [NSString stringWithFormat: @"screen-left=%i", [_screenLeftTextField intValue]]]; - [options addObject: [NSString stringWithFormat: @"screen-top=%i", [_screenTopTextField intValue]]]; - [options addObject: [NSString stringWithFormat: @"screen-width=%i", [_screenWidthTextField intValue]]]; - [options addObject: [NSString stringWithFormat: @"screen-height=%i", [_screenHeightTextField intValue]]]; - if ([_screenFollowMouseCheckbox intValue] == YES) - [options addObject: @"screen-follow-mouse"]; - else - [options addObject: @"no-screen-follow-mouse"]; - if ([_screenqtkAudioCheckbox state] && _avCurrentAudioDeviceUID) - [options addObject: [NSString stringWithFormat: @"input-slave=avaudiocapture://%@", _avCurrentAudioDeviceUID]]; + [self addScreenRecordingOptionsToArray:options]; } else if ([[[_captureModePopup selectedItem] title] isEqualToString: _NS("Input Devices")]) { - if ([_qtkVideoCheckbox state]) { - if ([_qtkAudioCheckbox state] && _avCurrentAudioDeviceUID) - [options addObject: [NSString stringWithFormat: @"input-slave=avaudiocapture://%@", _avCurrentAudioDeviceUID]]; - } + [self avDeviceOptionsToArray:options]; } } @@ -507,9 +420,79 @@ static NSString *kCaptureTabViewId = @"capture"; [[[VLCMain sharedInstance] playlistController] addPlaylistItems:@[inputMetadata]]; } -#pragma mark - -#pragma mark Main Actions +- (void)addSubtitleOptionsToArray:(NSMutableArray *)options +{ + module_config_t * p_item; + + [options addObject: [NSString stringWithFormat: @"sub-file=%@", _subPath]]; + if ([_fileSubOverrideCheckbox state] == NSOnState) { + [options addObject: [NSString stringWithFormat: @"sub-delay=%f", ([self fileSubDelay] * 10)]]; + [options addObject: [NSString stringWithFormat: @"sub-fps=%f", [self fileSubFps]]]; + } + [options addObject: [NSString stringWithFormat: + @"subsdec-encoding=%@", [[_fileSubEncodingPopup selectedItem] representedObject]]]; + [options addObject: [NSString stringWithFormat: + @"subsdec-align=%li", [_fileSubAlignPopup indexOfSelectedItem]]]; + + p_item = config_FindConfig("freetype-rel-fontsize"); + + if (p_item) { + [options addObject: [NSString stringWithFormat: + @"freetype-rel-fontsize=%i", + p_item->list.i[[_fileSubSizePopup indexOfSelectedItem]]]]; + } +} + +- (void)addTimingOptionsToArray:(NSMutableArray *)options +{ + NSInteger startTime = [NSString timeInSecondsFromStringWithColons:[_fileStartTimeTextField stringValue]]; + if (startTime > 0) { + [options addObject: [NSString stringWithFormat:@"start-time=%li", startTime]]; + } + + NSInteger stopTime = [NSString timeInSecondsFromStringWithColons:[_fileStopTimeTextField stringValue]]; + if (stopTime > 0) { + [options addObject: [NSString stringWithFormat:@"stop-time=%li", stopTime]]; + } +} +- (void)addStreamOutputOptionsToArray:(NSMutableArray *)options +{ + NSArray *soutMRL = [_output soutMRL]; + NSUInteger count = [soutMRL count]; + for (NSUInteger i = 0 ; i < count ; i++) + [options addObject: [NSString stringWithString: [soutMRL objectAtIndex:i]]]; +} + +- (void)addScreenRecordingOptionsToArray:(NSMutableArray *)options +{ + NSInteger selected_index = [_screenPopup indexOfSelectedItem]; + NSValue *v = [_displayInfos objectAtIndex:selected_index]; + struct display_info_t *item = (struct display_info_t *)[v pointerValue]; + + [options addObject: [NSString stringWithFormat: @"screen-fps=%f", [_screenFPSTextField floatValue]]]; + [options addObject: [NSString stringWithFormat: @"screen-display-id=%i", item->id]]; + [options addObject: [NSString stringWithFormat: @"screen-left=%i", [_screenLeftTextField intValue]]]; + [options addObject: [NSString stringWithFormat: @"screen-top=%i", [_screenTopTextField intValue]]]; + [options addObject: [NSString stringWithFormat: @"screen-width=%i", [_screenWidthTextField intValue]]]; + [options addObject: [NSString stringWithFormat: @"screen-height=%i", [_screenHeightTextField intValue]]]; + if ([_screenFollowMouseCheckbox intValue] == YES) + [options addObject: @"screen-follow-mouse"]; + else + [options addObject: @"no-screen-follow-mouse"]; + if ([_screenqtkAudioCheckbox state] && _avCurrentAudioDeviceUID) + [options addObject: [NSString stringWithFormat: @"input-slave=avaudiocapture://%@", _avCurrentAudioDeviceUID]]; +} + +- (void)avDeviceOptionsToArray:(NSMutableArray *)options +{ + if ([_qtkVideoCheckbox state]) { + if ([_qtkAudioCheckbox state] && _avCurrentAudioDeviceUID) + [options addObject: [NSString stringWithFormat: @"input-slave=avaudiocapture://%@", _avCurrentAudioDeviceUID]]; + } +} + +#pragma mark - UI interaction - (void)tabView:(NSTabView *)o_tv didSelectTabViewItem:(NSTabViewItem *)tabViewItem { @@ -783,8 +766,8 @@ static NSString *kCaptureTabViewId = @"capture"; NSString *devicePath; // BDMV path must not end with BDMV directory - if([type isEqualToString: kVLCMediaBDMVFolder]) { - if([[path lastPathComponent] isEqualToString: @"BDMV"]) { + if ([type isEqualToString: kVLCMediaBDMVFolder]) { + if ([[path lastPathComponent] isEqualToString: @"BDMV"]) { path = [path stringByDeletingLastPathComponent]; } } @@ -1302,16 +1285,67 @@ static NSString *kCaptureTabViewId = @"capture"; NSBeep(); } -- (void)updateVideoDevices +#pragma mark - audio and video device management + +- (void)updateVideoDevicesAndRepresentation { _avvideoDevices = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] arrayByAddingObjectsFromArray:[AVCaptureDevice devicesWithMediaType:AVMediaTypeMuxed]]; + + [_qtkVideoDevicePopup removeAllItems]; + msg_Dbg(getIntf(), "Found %lu video capture devices", _avvideoDevices.count); + + if (_avvideoDevices.count >= 1) { + if (!_avCurrentDeviceUID) + _avCurrentDeviceUID = [[[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] uniqueID] + stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + NSUInteger deviceCount = _avvideoDevices.count; + for (int ivideo = 0; ivideo < deviceCount; ivideo++) { + AVCaptureDevice *avDevice = [_avvideoDevices objectAtIndex:ivideo]; + // allow same name for multiple times + [[_qtkVideoDevicePopup menu] addItemWithTitle:[avDevice localizedName] action:nil keyEquivalent:@""]; + + if ([[[avDevice uniqueID] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] isEqualToString:_avCurrentDeviceUID]) + [_qtkVideoDevicePopup selectItemAtIndex:ivideo]; + } + } else { + [_qtkVideoDevicePopup addItemWithTitle: _NS("None")]; + } } -- (void)updateAudioDevices +- (void)updateAudioDevicesAndRepresentation { _avaudioDevices = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio] arrayByAddingObjectsFromArray:[AVCaptureDevice devicesWithMediaType:AVMediaTypeMuxed]]; + + [_qtkAudioDevicePopup removeAllItems]; + [_screenqtkAudioPopup removeAllItems]; + msg_Dbg(getIntf(), "Found %lu audio capture devices", _avaudioDevices.count); + + if (_avaudioDevices.count >= 1) { + if (!_avCurrentAudioDeviceUID) + _avCurrentAudioDeviceUID = [[[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio] uniqueID] + stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + NSUInteger deviceCount = _avaudioDevices.count; + for (int iaudio = 0; iaudio < deviceCount; iaudio++) { + AVCaptureDevice *avAudioDevice = [_avaudioDevices objectAtIndex:iaudio]; + + // allow same name for multiple times + NSString *localizedName = [avAudioDevice localizedName]; + [[_qtkAudioDevicePopup menu] addItemWithTitle:localizedName action:nil keyEquivalent:@""]; + [[_screenqtkAudioPopup menu] addItemWithTitle:localizedName action:nil keyEquivalent:@""]; + + if ([[[avAudioDevice uniqueID] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] isEqualToString:_avCurrentAudioDeviceUID]) { + [_qtkAudioDevicePopup selectItemAtIndex:iaudio]; + [_screenqtkAudioPopup selectItemAtIndex:iaudio]; + } + } + } else { + [_qtkAudioDevicePopup addItemWithTitle: _NS("None")]; + [_screenqtkAudioPopup addItemWithTitle: _NS("None")]; + } } @end _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
