summaryrefslogtreecommitdiff
path: root/orkaudio/AudioTape.h
blob: 8fd8e8f5a9825379fa03cfbe17bb8834d948fe20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * Oreka -- A media capture and retrieval platform
 * 
 * Copyright (C) 2005, orecx LLC
 *
 * http://www.orecx.com
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License.
 * Please refer to http://www.gnu.org/copyleft/gpl.html
 *
 */

#ifndef __AUDIOTAPE_H__
#define __AUDIOTAPE_H__

#include "ace/Thread_Mutex.h"
#include "time.h"
#include "StdString.h"
#include "boost/shared_ptr.hpp"
#include <queue>
#include "AudioCapture.h"
#include "audiofile/AudioFile.h"
#include "messages/Message.h"

class AudioTapeDescription : public Object
{
public:
	AudioTapeDescription();
	void Define(Serializer* s);
	void Validate();

	CStdString GetClassName();
	ObjectRef NewInstance();

	ObjectRef Process();

	CStdString m_capturePort;
	CStdString m_localParty;
	CStdString m_localEntryPoint;
	CStdString m_remoteParty;
	CaptureEvent::DirectionEnum m_direction;
	time_t m_beginDate;
	int m_duration;
	CStdString m_localIp;
	CStdString m_remoteIp;
};

class AudioTape
{
public:
	typedef enum 
	{
		StateUnknown = 0,
		StateCreated = 1,
		StateActive = 2,
		StateStopped = 3,
		StateError = 4,
		StateInvalid = 5
	} StateEnum; 

#define FF_NATIVE "native"
#define FF_GSM "GSM"
#define FF_ULAW "ulaw"
#define FF_ALAW "alaw"
#define FF_PCMWAV "pcmwav"
#define FF_UNKNOWN "unknown"
	typedef enum
	{
		FfUnknown = 0,
		FfNative = 1,
		FfGsm = 2,
		FfUlaw = 3,
		FfAlaw = 4,
		FfPcmWav = 5,
		FfInvalid = 6
	} FileFormatEnum;
	static int FileFormatToEnum(CStdString& format);
	static CStdString FileFormatToString(int formatEnum);
	static CStdString GetFileFormatExtension(FileFormatEnum);


	AudioTape(CStdString &portId);

	void AddAudioChunk(AudioChunkRef chunkRef);
	void Write();
	void SetShouldStop();
	bool IsStoppedAndValid();
	void AddCaptureEvent(CaptureEventRef eventRef, bool send = true);
	void GetMessage(MessageRef& msg);
	/** Returns an identifier for the tape which corresponds to the filename without extension */
	CStdString GetIdentifier();
	/** Returns the full filename (including relative path) to the post-compression audio file */
	CStdString GetFilename();
	CStdString GetPath();
	AudioFileRef GetAudioFileRef();
	bool IsReadyForBatchProcessing();

	CStdString m_portId;
	CStdString m_localParty;
	CStdString m_localEntryPoint;
	CStdString m_remoteParty;
	CaptureEvent::DirectionEnum m_direction;
	time_t m_beginDate;
	time_t m_endDate;
	time_t m_duration;
	CStdString m_localIp;
	CStdString m_remoteIp;
private:
	void GenerateFilePathAndIdentifier();

	CStdString m_filePath;
	CStdString m_fileIdentifier;
	CStdString m_fileExtension;	//Corresponds to the extension the tape will have after compression

	std::queue<AudioChunkRef> m_chunkQueue;

	std::queue<CaptureEventRef> m_eventQueue;
	std::queue<CaptureEventRef> m_toSendEventQueue;

	AudioFileRef m_audioFileRef;
	ACE_Thread_Mutex m_mutex;
	StateEnum m_state;
	bool m_shouldStop;
	bool m_readyForBatchProcessing;
};

typedef boost::shared_ptr<AudioTape> AudioTapeRef;

#endif