Skip to content

Commit 39d0d92

Browse files
dsward2dsward2
authored andcommitted
This commit adds two new objects to generalize and simplify task management - TaskPipelineManager and TaskItem. Those objects are now used for creating and managing the NSTask objects in EZStreamController, SDRController and SoxController.
TaskPipelineManager contains taskItemsArray property, an array of TaskItem objects, arranged in the correct order for the piped data to flow. Each TaskItem object has a NSTask property. TaskPipelineManager automatically connects each NSTask with NSPipes for stdin from the previous task, and stdout to the next task. TaskPipelineManager has methods to add arguments, start and terminate all NSTasks in the taskItemsArray. This change will be helpful for future projects like FM stereo decoding, and user-defined tasks (e.g., allow usage of alternative RTL-SDR decoders instead of the built-in rtl_fm_localradio tool).
1 parent b9db15c commit 39d0d92

12 files changed

Lines changed: 663 additions & 1306 deletions

LocalRadio.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@
101101
0E23B3161F1F36EE00565394 /* SoxController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E23B3151F1F36ED00565394 /* SoxController.m */; };
102102
0E28BE6B1F2B6A48005999FB /* UDPStatusListenerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E28BE6A1F2B6A47005999FB /* UDPStatusListenerController.m */; };
103103
0E28BE921F2C0DFA005999FB /* UDPStatusListener.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E28BE911F2C0DFA005999FB /* UDPStatusListener.m */; };
104+
0E32F8BD1FEB9FC500492813 /* TaskPipelineManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E32F8BC1FEB9FC500492813 /* TaskPipelineManager.m */; };
105+
0E32F8E41FEBA01600492813 /* TaskItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E32F8E31FEBA01600492813 /* TaskItem.m */; };
104106
0E3CB0E71F65FAD50088B498 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 0E3CB0E61F65FAD50088B498 /* README.md */; };
105107
0E3CB0E91F679AB40088B498 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 0E3CB0E81F679AB40088B498 /* LICENSE */; };
106108
0E4461921F4420A9003C7851 /* scannerlistenbuttonclicked.html in Resources */ = {isa = PBXBuildFile; fileRef = 0E4461911F4420A9003C7851 /* scannerlistenbuttonclicked.html */; };
@@ -765,6 +767,10 @@
765767
0E28BE6A1F2B6A47005999FB /* UDPStatusListenerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UDPStatusListenerController.m; sourceTree = "<group>"; };
766768
0E28BE901F2C0DFA005999FB /* UDPStatusListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UDPStatusListener.h; sourceTree = "<group>"; };
767769
0E28BE911F2C0DFA005999FB /* UDPStatusListener.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UDPStatusListener.m; sourceTree = "<group>"; };
770+
0E32F8BB1FEB9FC500492813 /* TaskPipelineManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TaskPipelineManager.h; sourceTree = "<group>"; };
771+
0E32F8BC1FEB9FC500492813 /* TaskPipelineManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TaskPipelineManager.m; sourceTree = "<group>"; };
772+
0E32F8E21FEBA01500492813 /* TaskItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TaskItem.h; sourceTree = "<group>"; };
773+
0E32F8E31FEBA01600492813 /* TaskItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TaskItem.m; sourceTree = "<group>"; };
768774
0E37AE881EFCE0CF005BB6E9 /* storefrequency.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = storefrequency.html; sourceTree = "<group>"; };
769775
0E3CB0E61F65FAD50088B498 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
770776
0E3CB0E81F679AB40088B498 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
@@ -1751,6 +1757,10 @@
17511757
0ED9ED461F529A2A00898460 /* LocalRadioAppSettings.m */,
17521758
0EC207651EDCE11A006899EB /* SDRController.h */,
17531759
0EC207661EDCE11A006899EB /* SDRController.m */,
1760+
0E32F8BB1FEB9FC500492813 /* TaskPipelineManager.h */,
1761+
0E32F8BC1FEB9FC500492813 /* TaskPipelineManager.m */,
1762+
0E32F8E21FEBA01500492813 /* TaskItem.h */,
1763+
0E32F8E31FEBA01600492813 /* TaskItem.m */,
17541764
0E84C9711ED8DA650065864B /* WebServerConnection.h */,
17551765
0E84C9721ED8DA650065864B /* WebServerConnection.m */,
17561766
0E4ED1AB1EAB823B00D2157B /* WebServerController.h */,
@@ -4174,13 +4184,15 @@
41744184
files = (
41754185
0EB8CB671F793CDE004B6D05 /* APPNOTES.md in Sources */,
41764186
0E4ED1871EAB7E0500D2157B /* DDLog.m in Sources */,
4187+
0E32F8BD1FEB9FC500492813 /* TaskPipelineManager.m in Sources */,
41774188
0E4ED1851EAB7DC700D2157B /* WebSocket.m in Sources */,
41784189
0E28BE921F2C0DFA005999FB /* UDPStatusListener.m in Sources */,
41794190
0EB8CB3F1F793880004B6D05 /* SCREENSHOTS.md in Sources */,
41804191
0E0FDA031EF76AF800FEEA06 /* IcecastController.m in Sources */,
41814192
0E4ED18F1EAB7E5400D2157B /* HTTPErrorResponse.m in Sources */,
41824193
0E4ECFC31EAB633B00D2157B /* main.m in Sources */,
41834194
0E4ED1901EAB7E5700D2157B /* HTTPFileResponse.m in Sources */,
4195+
0E32F8E41FEBA01600492813 /* TaskItem.m in Sources */,
41844196
0EC207671EDCE11A006899EB /* SDRController.m in Sources */,
41854197
0E5C52421F064237005CA515 /* GCDAsyncSocket.m in Sources */,
41864198
0E0563191F1A3C0D0093B473 /* WebViewDelegate.m in Sources */,

LocalRadio/AppDelegate.m

Lines changed: 17 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#import "NSFileManager+DirectoryLocations.h"
2424
#import "WebViewDelegate.h"
2525
#import "UDPStatusListenerController.h"
26+
#import "TaskPipelineManager.h"
27+
#import "TaskItem.h"
2628
#import "FCCSearchController.h"
2729
#import <IOKit/usb/IOUSBLib.h>
2830
//#import <IOKit/hid/IOHIDManager.h>
@@ -234,7 +236,6 @@ - (void)resetRtlsdrStatusText
234236
*/
235237
}
236238

237-
238239
//==================================================================================
239240
// updateCurrentTasksText:
240241
//==================================================================================
@@ -243,87 +244,36 @@ - (void)updateCurrentTasksText
243244
{
244245
NSMutableString * tasksString = [NSMutableString string];
245246

246-
if (self.ezStreamController.udpListenerTaskProcessID != 0)
247-
{
248-
[tasksString appendFormat:@"EZStreamController UDPListener - process ID = %d\n\n", self.ezStreamController.udpListenerTaskProcessID];
249-
250-
[tasksString appendFormat:@"%@ %@\n\n",
251-
self.ezStreamController.quotedUDPListenerPath, self.ezStreamController.udpListenerArgsString];
252-
}
253-
254-
if (self.ezStreamController.soxTaskProcessID != 0)
255-
{
256-
[tasksString appendFormat:@"EZStreamController Sox - process ID = %d\n\n", self.ezStreamController.soxTaskProcessID];
257-
258-
[tasksString appendFormat:@"%@ %@\n\n",
259-
self.ezStreamController.quotedSoxPath, self.ezStreamController.soxArgsString];
260-
}
261-
262-
if (self.ezStreamController.ezStreamTaskProcessID != 0)
263-
{
264-
[tasksString appendFormat:@"EZStreamController EZStream - process ID = %d\n\n", self.ezStreamController.ezStreamTaskProcessID];
265-
266-
[tasksString appendFormat:@"%@ %@\n\n",
267-
self.ezStreamController.quotedEZStreamPath, self.ezStreamController.ezStreamArgsString];
268-
}
247+
[tasksString appendString:@"--- Icecast tasks ---\n\n"];
269248

270249
if (self.icecastController.icecastTaskProcessID != 0)
271250
{
272-
[tasksString appendFormat:@"IcecastController Icecast - process ID = %d\n\n", self.icecastController.icecastTaskProcessID];
251+
252+
[tasksString appendFormat:@"Icecast - process ID = %d\n\n", self.icecastController.icecastTaskProcessID];
273253

274254
[tasksString appendFormat:@"%@ %@\n\n",
275255
self.icecastController.quotedIcecastPath, self.icecastController.icecastTaskArgsString];
276256
}
277-
278-
if (self.sdrController.rtlfmTaskProcessID != 0)
279-
{
280-
[tasksString appendFormat:@"SDRController rtl_fm_localradio - process ID = %d\n\n", self.sdrController.rtlfmTaskProcessID];
281-
282-
[tasksString appendFormat:@"%@ %@\n\n",
283-
self.sdrController.quotedRtlfmPath, self.sdrController.rtlfmTaskArgsString];
284-
}
285-
286-
if (self.sdrController.audioMonitorTaskProcessID != 0)
287-
{
288-
[tasksString appendFormat:@"SDRController AudioMonitor - process ID = %d\n\n", self.sdrController.audioMonitorTaskProcessID];
289-
290-
[tasksString appendFormat:@"%@ %@\n\n",
291-
self.sdrController.quotedAudioMonitorPath, self.sdrController.audioMonitorTaskArgsString];
292-
}
293-
294-
if (self.sdrController.soxTaskProcessID != 0)
257+
else
295258
{
296-
[tasksString appendFormat:@"SDRController Sox - process ID = %d\n\n", self.sdrController.soxTaskProcessID];
297-
298-
[tasksString appendFormat:@"%@ %@\n\n",
299-
self.sdrController.quotedSoxPath, self.sdrController.soxTaskArgsString];
259+
[tasksString appendString:@"No tasks currently running\n\n"];
300260
}
301261

302-
if (self.sdrController.udpSenderTask != NULL)
303-
{
304-
[tasksString appendFormat:@"SDRController UDPSender - process ID = %d\n\n", self.sdrController.udpSenderTaskProcessID];
262+
[tasksString appendString:@"--- EZStream tasks ---\n\n"];
305263

306-
[tasksString appendFormat:@"%@ %@\n\n",
307-
self.sdrController.quotedUDPSenderPath, self.sdrController.udpSenderTaskArgsString];
308-
}
264+
NSString * ezStreamTasksString = self.ezStreamController.ezStreamTaskPipelineManager.tasksInfoString;
265+
[tasksString appendString:ezStreamTasksString];
309266

310-
if (self.soxController.soxTask != NULL)
311-
{
312-
[tasksString appendFormat:@"SoxController Sox - process ID = %d\n\n", self.soxController.soxTask.processIdentifier];
267+
[tasksString appendString:@"--- RTL-SDR radio tasks ---"];
313268

314-
[tasksString appendFormat:@"%@ %@\n\n",
315-
self.soxController.quotedSoxPath, self.soxController.soxTaskArgsString];
316-
}
317-
269+
NSString * radioTasksString = self.sdrController.radioTaskPipelineManager.tasksInfoString;
270+
[tasksString appendString:radioTasksString];
318271

319-
if (self.soxController.udpSenderTask != NULL)
320-
{
321-
[tasksString appendFormat:@"SoxController UDPSender - process ID = %d\n\n", self.soxController.udpSenderTask.processIdentifier];
272+
[tasksString appendString:@"--- Sox second-stage audio tasks ---"];
273+
274+
NSString * soxTasksString = self.soxController.soxControllerTaskPipelineManager.tasksInfoString;
275+
[tasksString appendString:soxTasksString];
322276

323-
[tasksString appendFormat:@"%@ %@\n\n",
324-
self.soxController.quotedUDPSenderPath, self.soxController.udpSenderTaskArgsString];
325-
}
326-
327277
dispatch_async(dispatch_get_main_queue(), ^{
328278

329279
[self.statusCurrentTasksTextView setString:tasksString];

LocalRadio/EZStreamController.h

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,37 @@
99
#import <Foundation/Foundation.h>
1010

1111
@class AppDelegate;
12+
@class TaskPipelineManager;
1213

1314
@interface EZStreamController : NSObject
1415

1516
@property(strong) IBOutlet AppDelegate * appDelegate;
1617

17-
@property (strong) NSTask * udpListenerTask;
18-
@property (strong) NSPipe * udpListenerTaskStandardErrorPipe;
18+
@property (strong) TaskPipelineManager * ezStreamTaskPipelineManager;
1919

20-
@property (strong) NSTask * ezStreamTask;
21-
@property (strong) NSPipe * ezStreamTaskStandardErrorPipe;
20+
//@property (strong) NSTask * udpListenerTask;
21+
//@property (strong) NSPipe * udpListenerTaskStandardErrorPipe;
2222

23-
@property (strong) NSTask * soxTask;
24-
@property (strong) NSPipe * soxTaskStandardErrorPipe;
23+
//@property (strong) NSTask * ezStreamTask;
24+
//@property (strong) NSPipe * ezStreamTaskStandardErrorPipe;
2525

26-
@property (strong) NSPipe * udpListenerSoxPipe;
27-
@property (strong) NSPipe * soxEZStreamPipe;
26+
//@property (strong) NSTask * soxTask;
27+
//@property (strong) NSPipe * soxTaskStandardErrorPipe;
2828

29-
@property (strong) NSString * quotedUDPListenerPath;
30-
@property (strong) NSString * quotedSoxPath;
31-
@property (strong) NSString * quotedEZStreamPath;
29+
//@property (strong) NSPipe * udpListenerSoxPipe;
30+
//@property (strong) NSPipe * soxEZStreamPipe;
3231

33-
@property (strong) NSString * udpListenerArgsString;
34-
@property (strong) NSString * soxArgsString;
35-
@property (strong) NSString * ezStreamArgsString;
32+
//@property (strong) NSString * quotedUDPListenerPath;
33+
//@property (strong) NSString * quotedSoxPath;
34+
//@property (strong) NSString * quotedEZStreamPath;
3635

37-
@property (assign) int ezStreamTaskProcessID;
38-
@property (assign) int soxTaskProcessID;
39-
@property (assign) int udpListenerTaskProcessID;
36+
//@property (strong) NSString * udpListenerArgsString;
37+
//@property (strong) NSString * soxArgsString;
38+
//@property (strong) NSString * ezStreamArgsString;
39+
40+
//@property (assign) int ezStreamTaskProcessID;
41+
//@property (assign) int soxTaskProcessID;
42+
//@property (assign) int udpListenerTaskProcessID;
4043

4144
- (void)terminateTasks;
4245

0 commit comments

Comments
 (0)