File: NetworkPersistence_example.cxx

package info (click to toggle)
clam 1.4.0-5.1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 17,780 kB
  • sloc: cpp: 92,499; python: 9,721; ansic: 1,602; xml: 444; sh: 239; makefile: 153; perl: 54; asm: 15
file content (157 lines) | stat: -rw-r--r-- 5,165 bytes parent folder | download | duplicates (2)
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

/*
 * Copyright (c) 2001-2004 MUSIC TECHNOLOGY GROUP (MTG)
 *                         UNIVERSITAT POMPEU FABRA
 *
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */


/**
 *  The goals of this example is to show you how to:
 *      -> Use network methods to store its content definition in XML.
 *      -> Activate an XML to get a fully functional network again.
 */

#include "XMLStorage.hxx"
#include "Network.hxx"
#include "PushFlowControl.hxx"
#include "Err.hxx"
#include "SimpleOscillator.hxx"
#include "Oscillator.hxx"
#include "AudioMultiplier.hxx"
#include "AudioAdder.hxx"
#include "AudioIO.hxx"
#include "AudioOut.hxx"
#include "AudioManager.hxx"

#include "AudioFile.hxx"
#include <iostream>
#include <QtGui/QFileDialog>
#include <QtCore/QString>
#include <QApplication>

int main( int argc, char** argv )
{	
	QApplication a(argc,argv);
	try
	{
 		// The first steps of this example are equals to NetworkUsage_example.cxx, so please
		// take a look on it before starting with this, in order to get a full idea about
		// the things we are doing here.
		// Also AudioFileIO_example.cxx should be consulted before.

		int size = 512;
		int sampleRate = 44100;

		// network initialization

		CLAM::AudioManager audioManager( sampleRate, size );
		CLAM::Network * network = new CLAM::Network;
		network->SetName("Network To Store");

		CLAM::SimpleOscillatorConfig osc1Cfg;
		osc1Cfg.SetFrequency(220.0);
		osc1Cfg.SetSamplingRate( sampleRate );

		CLAM::SimpleOscillatorConfig osc2Cfg;
		osc2Cfg.SetFrequency(10.0);
		osc2Cfg.SetPhase(0.5);
		osc2Cfg.SetAmplitude(0.5);
		osc2Cfg.SetSamplingRate( sampleRate );

		CLAM::SimpleOscillatorConfig osc3Cfg;
		osc3Cfg.SetFrequency(880.0);		
		osc3Cfg.SetAmplitude(0.5);
		osc3Cfg.SetSamplingRate( sampleRate );

		CLAM::OscillatorConfig osc4Cfg;
		osc4Cfg.SetFrequency(440.0);
		

		CLAM::AudioIOConfig audioOutCfg;
		audioOutCfg.SetFrameSize( size );
		audioOutCfg.SetSampleRate( sampleRate );
		audioOutCfg.SetChannelID( 0 );

		network->AddProcessing( "Generator", new CLAM::SimpleOscillator( osc1Cfg ) );
		network->AddProcessing( "Modulated Generator", new CLAM::Oscillator( osc4Cfg ) );
		network->AddProcessing( "Phase Modulator", new CLAM::SimpleOscillator( osc2Cfg ) );
		network->AddProcessing( "Frequency Modulator", new CLAM::SimpleOscillator( osc3Cfg ) );
		network->AddProcessing( "multiplier", new CLAM::AudioMultiplier );
		network->AddProcessing( "audio out", new CLAM::AudioOut( audioOutCfg ) );

		network->ConnectPorts( "Generator.Audio Output", "multiplier.First Audio Input" );
		network->ConnectPorts( "Modulated Generator.Audio Output", "multiplier.Second Audio Input" );
		network->ConnectPorts( "multiplier.Audio Output", "audio out.Audio Input" );
		network->ConnectPorts( "Phase Modulator.Audio Output", "Modulated Generator.Input Phase Modulation" );
		network->ConnectPorts( "Frequency Modulator.Audio Output", "Modulated Generator.Input Frequency Modulation" );

		// Now that we have the network created with our desired processing and connections, we will store it to an xml file.

		QString networkFileName = QFileDialog::getSaveFileName(0,
			QObject::tr("Please, specify the xml where network will be stored"),
			QObject::tr("MyNetwork.clamnetwork"),
			"*.clamnetwork");
		if ( networkFileName == NULL )
		{
			std::cout << "User cancelled" << std::endl;
			exit(0);
		}

		// the first step to passivate the network is create an storage object
		CLAM::XMLStorage::Dump( *network, "network", networkFileName.toStdString().c_str() );

		// ok, we just stored it. You can take a look to the file you specified, read the contents and modify it if you want
		// (to your own risk, of course).
		// We don't need this network anymore
		delete network;
	
		// It's time to load this network to another instance and check if it works correctly.

		CLAM::Network * network2 = new CLAM::Network; 
		network2->SetName("Network Loaded");

		CLAM::XMLStorage::Restore( *network2, networkFileName.toStdString().c_str() );

		// With these few lines we have in "network2" the same connections and processings (with his configs) that we had in "network".

		network2->Start();

		for(int i=0;i<300;i++)
			network2->Do();

		network2->Stop();

		delete network2;
		std::cout << "ok, now I know how to passivate and activate a CLAM network!" << std::endl;

	}
	catch ( CLAM::Err& e )
	{
		e.Print();
		exit(-1);
	}
	catch( std::exception& e )
	{
		std::cerr << e.what() << std::endl;
		exit(-1);		
	}

	return 0;
}