Commit 594cf1ed authored by Mikhail Karpenko's avatar Mikhail Karpenko
Browse files

WIP: spawn several streamers from main

parent 6e2f0b2d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
PROG       = str
CXXFLAGS   += -Wall -O2 -I$(STAGING_DIR_HOST)/usr/include-uapi
CXXFLAGS   += -Wall -O2 -std=c++11 -I$(STAGING_DIR_HOST)/usr/include-uapi
LDFLAGS    += -s -lpthread -lasound

SRCS       = main.cpp streamer.cpp audio.cpp video.cpp socket.cpp rtsp.cpp rtp_stream.cpp helpers.cpp parameters.cpp
+42 −12
Original line number Diff line number Diff line
/**
 * @file FILENAME
 * @brief BRIEF DESCRIPTION
 * @copyright Copyright (C) YEAR Elphel Inc.
 * @file main.cpp
 * @brief Spawn single instance of streamer for each sensor port.
 * @copyright Copyright (C) 2017 Elphel Inc.
 * @author AUTHOR <EMAIL>
 *
 * @par License:
@@ -22,6 +22,7 @@
#include <iostream>
#include <string>
#include <map>
#include <array>

#include "streamer.h"

@@ -29,10 +30,25 @@ using namespace std;

#include <unistd.h>
#include <linux/sysctl.h>
#include <elphel/c313a.h>
#include <pthread.h>

/**
 * Unconditionally cancel all threads.
 * @param   threads   an array of thread pointers
 * @return  None
 */
void clean_up(array<pthread_t, SENSOR_PORTS> &threads) {
	for (array<pthread_t, SENSOR_PORTS>::iterator it = threads.begin(); it != threads.end(); it++)
		pthread_cancel(*it);
}

int main(int argc, char *argv[]) {
	string opt;
	map<string, string> args;
	array < pthread_t, SENSOR_PORTS > threads;
	array<Streamer *, SENSOR_PORTS> streamers;

	for (int i = 1; i < argc; i++) {
		if (argv[i][0] == '-' && argv[i][1] != '\0') {
			if (opt != "")
@@ -52,7 +68,21 @@ int main(int argc, char *argv[]) {
		cerr << "|" << (*it).first << "| == |" << (*it).second << "|" << endl;
	}

	Streamer *streamer = new Streamer(args);
	streamer->Main();
	for (int i = 0; i < SENSOR_PORTS; i++) {
		pthread_attr_t attr;
		streamers[i] = new Streamer(args);

		pthread_attr_init(&attr);
		pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
		if (!pthread_create(&threads[i], &attr, Streamer::pthread_f, (void *) streamers[i])) {
			cerr << "Can not spawn streamer thread for port " << to_string(i) << endl;
			clean_up(threads);
			exit(EXIT_FAILURE);
		}
		pthread_attr_destroy(&attr);
	}
	for (array<pthread_t, SENSOR_PORTS>::iterator it = threads.begin(); it != threads.end(); it++)
		pthread_join(*it, NULL);

	return 0;
}