mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 04:50:29 -04:00 
			
		
		
		
	File source: play/pause button implemented with stream timing update
This commit is contained in:
		
							parent
							
								
									0603bb41ca
								
							
						
					
					
						commit
						047e9f3e24
					
				| @ -129,7 +129,7 @@ bool FileSourceGui::handleMessage(Message* message) | |||||||
| 	} | 	} | ||||||
| 	else if(FileSourceInput::MsgReportFileSourceStreamData::match(message)) | 	else if(FileSourceInput::MsgReportFileSourceStreamData::match(message)) | ||||||
| 	{ | 	{ | ||||||
| 		std::cerr << "FileSourceGui::handleMessage: MsgReportFileSourceStreamData" << std::endl; | 		//std::cerr << "FileSourceGui::handleMessage: MsgReportFileSourceStreamData" << std::endl;
 | ||||||
| 		m_sampleRate = ((FileSourceInput::MsgReportFileSourceStreamData*)message)->getSampleRate(); | 		m_sampleRate = ((FileSourceInput::MsgReportFileSourceStreamData*)message)->getSampleRate(); | ||||||
| 		m_centerFrequency = ((FileSourceInput::MsgReportFileSourceStreamData*)message)->getCenterFrequency(); | 		m_centerFrequency = ((FileSourceInput::MsgReportFileSourceStreamData*)message)->getCenterFrequency(); | ||||||
| 		m_startingTimeStamp = ((FileSourceInput::MsgReportFileSourceStreamData*)message)->getStartingTimeStamp(); | 		m_startingTimeStamp = ((FileSourceInput::MsgReportFileSourceStreamData*)message)->getStartingTimeStamp(); | ||||||
| @ -137,6 +137,12 @@ bool FileSourceGui::handleMessage(Message* message) | |||||||
| 		message->completed(); | 		message->completed(); | ||||||
| 		return true; | 		return true; | ||||||
| 	} | 	} | ||||||
|  | 	else if(FileSourceInput::MsgReportFileSourceStreamTiming::match(message)) | ||||||
|  | 	{ | ||||||
|  | 		m_samplesCount = ((FileSourceInput::MsgReportFileSourceStreamTiming*)message)->getSamplesCount(); | ||||||
|  | 		std::cerr << "FileSourceGui::handleMessage: MsgReportFileSourceStreamTiming: " << m_samplesCount << std::endl; | ||||||
|  | 		updateWithStreamTime(); | ||||||
|  | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		return false; | 		return false; | ||||||
| @ -165,6 +171,8 @@ void FileSourceGui::updateHardware() | |||||||
| 
 | 
 | ||||||
| void FileSourceGui::on_play_toggled(bool checked) | void FileSourceGui::on_play_toggled(bool checked) | ||||||
| { | { | ||||||
|  | 	FileSourceInput::MsgConfigureFileSourceWork* message = FileSourceInput::MsgConfigureFileSourceWork::create(checked); | ||||||
|  | 	message->submit(m_pluginAPI->getDSPEngineMessageQueue()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void FileSourceGui::on_showFileDialog_clicked(bool checked) | void FileSourceGui::on_showFileDialog_clicked(bool checked) | ||||||
| @ -212,15 +220,17 @@ void FileSourceGui::updateWithStreamTime() | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	QTime t(0, 0, 0, 0); | 	QTime t(0, 0, 0, 0); | ||||||
| 	t.addSecs(t_sec); | 	t = t.addSecs(t_sec); | ||||||
| 	t.addMSecs(t_msec); | 	t = t.addMSecs(t_msec); | ||||||
| 	QString s_time = t.toString("hh:mm:ss.zzz"); | 	QString s_time = t.toString("hh:mm:ss.zzz"); | ||||||
| 	ui->relTimeText->setText(s_time); | 	ui->relTimeText->setText(s_time); | ||||||
| 
 | 
 | ||||||
|  | 	//std::cerr << "FileSourceGui::updateWithStreamTime: " << t_sec << "." << t_msec << " " << s_time.toStdString() << std::endl;
 | ||||||
|  | 
 | ||||||
| 	quint64 startingTimeStampMsec = m_startingTimeStamp * 1000; | 	quint64 startingTimeStampMsec = m_startingTimeStamp * 1000; | ||||||
| 	QDateTime dt = QDateTime::fromMSecsSinceEpoch(startingTimeStampMsec); | 	QDateTime dt = QDateTime::fromMSecsSinceEpoch(startingTimeStampMsec); | ||||||
| 	dt.addSecs(t_sec); | 	dt = dt.addSecs(t_sec); | ||||||
| 	dt.addMSecs(t_msec); | 	dt = dt.addMSecs(t_msec); | ||||||
| 	QString s_date = dt.toString("yyyyMMdd hh.mm.ss.zzz"); | 	QString s_date = dt.toString("yyyyMMdd hh.mm.ss.zzz"); | ||||||
| 	ui->absTimeText->setText(s_date); | 	ui->absTimeText->setText(s_date); | ||||||
| } | } | ||||||
|  | |||||||
| @ -28,8 +28,10 @@ | |||||||
| 
 | 
 | ||||||
| MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSource, Message) | MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSource, Message) | ||||||
| MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSourceName, Message) | MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSourceName, Message) | ||||||
|  | MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSourceWork, Message) | ||||||
| MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceAcquisition, Message) | MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceAcquisition, Message) | ||||||
| MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceStreamData, Message) | MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceStreamData, Message) | ||||||
|  | MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceStreamTiming, Message) | ||||||
| 
 | 
 | ||||||
| FileSourceInput::Settings::Settings() : | FileSourceInput::Settings::Settings() : | ||||||
| 	m_fileName("./test.sdriq") | 	m_fileName("./test.sdriq") | ||||||
| @ -187,14 +189,36 @@ std::time_t FileSourceInput::getStartingTimeStamp() const | |||||||
| 
 | 
 | ||||||
| bool FileSourceInput::handleMessage(Message* message) | bool FileSourceInput::handleMessage(Message* message) | ||||||
| { | { | ||||||
| 	if(MsgConfigureFileSourceName::match(message)) { | 	if (MsgConfigureFileSourceName::match(message)) | ||||||
| 		std::cerr << "FileSourceInput::handleMessage: MsgConfigureFileName" << std::endl; | 	{ | ||||||
|  | 		//std::cerr << "FileSourceInput::handleMessage: MsgConfigureFileName" << std::endl;
 | ||||||
| 		MsgConfigureFileSourceName* conf = (MsgConfigureFileSourceName*) message; | 		MsgConfigureFileSourceName* conf = (MsgConfigureFileSourceName*) message; | ||||||
| 		m_fileName = conf->getFileName(); | 		m_fileName = conf->getFileName(); | ||||||
| 		openFileStream(); | 		openFileStream(); | ||||||
| 		message->completed(); | 		message->completed(); | ||||||
| 		return true; | 		return true; | ||||||
|  | 	} | ||||||
|  | 	else if (MsgConfigureFileSourceWork::match(message)) | ||||||
|  | 	{ | ||||||
|  | 		//std::cerr << "FileSourceInput::handleMessage: MsgConfigureFileSourceWork: ";
 | ||||||
|  | 		MsgConfigureFileSourceWork* conf = (MsgConfigureFileSourceWork*) message; | ||||||
|  | 		bool working = conf->isWorking(); | ||||||
|  | 		//std::cerr << (working ? "working" : "not working") << std::endl;
 | ||||||
|  | 		if (m_fileSourceThread != 0) | ||||||
|  | 		{ | ||||||
|  | 			if (working) { | ||||||
|  | 				m_fileSourceThread->startWork(); | ||||||
| 			} else { | 			} else { | ||||||
|  | 				m_fileSourceThread->stopWork(); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			MsgReportFileSourceStreamTiming::create(m_fileSourceThread->getSamplesCount())->submit(m_guiMessageQueue); | ||||||
|  | 		} | ||||||
|  | 		message->completed(); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -80,6 +80,26 @@ public: | |||||||
| 		{ } | 		{ } | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
|  | 	class MsgConfigureFileSourceWork : public Message { | ||||||
|  | 		MESSAGE_CLASS_DECLARATION | ||||||
|  | 
 | ||||||
|  | 	public: | ||||||
|  | 		bool isWorking() const { return m_working; } | ||||||
|  | 
 | ||||||
|  | 		static MsgConfigureFileSourceWork* create(bool working) | ||||||
|  | 		{ | ||||||
|  | 			return new MsgConfigureFileSourceWork(working); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	private: | ||||||
|  | 		bool m_working; | ||||||
|  | 
 | ||||||
|  | 		MsgConfigureFileSourceWork(bool working) : | ||||||
|  | 			Message(), | ||||||
|  | 			m_working(working) | ||||||
|  | 		{ } | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
| 	class MsgReportFileSourceAcquisition : public Message { | 	class MsgReportFileSourceAcquisition : public Message { | ||||||
| 		MESSAGE_CLASS_DECLARATION | 		MESSAGE_CLASS_DECLARATION | ||||||
| 
 | 
 | ||||||
| @ -126,6 +146,26 @@ public: | |||||||
| 		{ } | 		{ } | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
|  | 	class MsgReportFileSourceStreamTiming : public Message { | ||||||
|  | 		MESSAGE_CLASS_DECLARATION | ||||||
|  | 
 | ||||||
|  | 	public: | ||||||
|  | 		std::size_t getSamplesCount() const { return m_samplesCount; } | ||||||
|  | 
 | ||||||
|  | 		static MsgReportFileSourceStreamTiming* create(std::size_t samplesCount) | ||||||
|  | 		{ | ||||||
|  | 			return new MsgReportFileSourceStreamTiming(samplesCount); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	protected: | ||||||
|  | 		std::size_t m_samplesCount; | ||||||
|  | 
 | ||||||
|  | 		MsgReportFileSourceStreamTiming(std::size_t samplesCount) : | ||||||
|  | 			Message(), | ||||||
|  | 			m_samplesCount(samplesCount) | ||||||
|  | 		{ } | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
| 	FileSourceInput(MessageQueue* msgQueueToGUI, const QTimer& masterTimer); | 	FileSourceInput(MessageQueue* msgQueueToGUI, const QTimer& masterTimer); | ||||||
| 	~FileSourceInput(); | 	~FileSourceInput(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -31,6 +31,7 @@ FileSourceThread::FileSourceThread(std::ifstream *samplesStream, SampleFifo* sam | |||||||
| 	m_bufsize(0), | 	m_bufsize(0), | ||||||
| 	m_chunksize(0), | 	m_chunksize(0), | ||||||
| 	m_sampleFifo(sampleFifo), | 	m_sampleFifo(sampleFifo), | ||||||
|  | 	m_samplesCount(0), | ||||||
| 	m_samplerate(0) | 	m_samplerate(0) | ||||||
| { | { | ||||||
|     assert(m_ifstream != 0); |     assert(m_ifstream != 0); | ||||||
| @ -142,12 +143,14 @@ void FileSourceThread::tick() | |||||||
|             // TODO: handle loop playback situation
 |             // TODO: handle loop playback situation
 | ||||||
|     		m_ifstream->clear(); |     		m_ifstream->clear(); | ||||||
|     		m_ifstream->seekg(0, std::ios::beg); |     		m_ifstream->seekg(0, std::ios::beg); | ||||||
|  |     		m_samplesCount = 0; | ||||||
|             //stopWork();
 |             //stopWork();
 | ||||||
|             //m_ifstream->close();
 |             //m_ifstream->close();
 | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             m_sampleFifo->write(m_buf, m_chunksize); |             m_sampleFifo->write(m_buf, m_chunksize); | ||||||
|  |     		m_samplesCount += m_chunksize / 4; | ||||||
|         } |         } | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -40,6 +40,7 @@ public: | |||||||
| 	void stopWork(); | 	void stopWork(); | ||||||
| 	void setSamplerate(int samplerate); | 	void setSamplerate(int samplerate); | ||||||
| 	bool isRunning() const { return m_running; } | 	bool isRunning() const { return m_running; } | ||||||
|  | 	std::size_t getSamplesCount() const { return m_samplesCount; } | ||||||
| 
 | 
 | ||||||
| 	void connectTimer(const QTimer& timer); | 	void connectTimer(const QTimer& timer); | ||||||
| 
 | 
 | ||||||
| @ -53,6 +54,7 @@ private: | |||||||
| 	std::size_t m_bufsize; | 	std::size_t m_bufsize; | ||||||
| 	std::size_t m_chunksize; | 	std::size_t m_chunksize; | ||||||
| 	SampleFifo* m_sampleFifo; | 	SampleFifo* m_sampleFifo; | ||||||
|  | 	std::size_t m_samplesCount; | ||||||
| 
 | 
 | ||||||
| 	int m_samplerate; | 	int m_samplerate; | ||||||
| 	static const int m_rateDivider; | 	static const int m_rateDivider; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user