00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "userDataAudio.h"
00016 #include "userDataAudioCursor.h"
00017
00018 TypeHandle UserDataAudio::_type_handle;
00019
00020
00021
00022
00023
00024
00025
00026 UserDataAudio::
00027 UserDataAudio(int rate, int channels, bool remove_after_read) :
00028 MovieAudio("User Data Audio"),
00029 _desired_rate(rate),
00030 _desired_channels(channels),
00031 _cursor(NULL),
00032 _aborted(false),
00033 _remove_after_read(remove_after_read)
00034 {
00035 }
00036
00037
00038
00039
00040
00041
00042 UserDataAudio::
00043 ~UserDataAudio() {
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053 PT(MovieAudioCursor) UserDataAudio::
00054 open() {
00055 if (_cursor) {
00056 nassert_raise("A UserDataAudio can only be opened by one consumer at a time.");
00057 return NULL;
00058 }
00059 _cursor = new UserDataAudioCursor(this);
00060 return _cursor;
00061 }
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 void UserDataAudio::
00072 read_samples(int n, PN_int16 *data) {
00073 int ready = (_data.size() / _desired_channels);
00074 int desired = n * _desired_channels;
00075 int avail = ready * _desired_channels;
00076 if (avail > desired) avail = desired;
00077 for (int i=0; i<avail; i++) {
00078 data[i] = _data[i];
00079 }
00080 for (int i=avail; i<desired; i++) {
00081 data[i] = 0;
00082 }
00083 for (int i=0; i<avail; i++) {
00084 _data.pop_front();
00085 }
00086 }
00087
00088
00089
00090
00091
00092
00093 void UserDataAudio::
00094 append(PN_int16 *data, int n) {
00095 nassertv(!_aborted);
00096 int words = n * _desired_channels;
00097 for (int i=0; i<words; i++) {
00098 _data.push_back(data[i]);
00099 }
00100 }
00101
00102
00103
00104
00105
00106
00107
00108
00109 void UserDataAudio::
00110 append(DatagramIterator *src, int n) {
00111 nassertv(!_aborted);
00112 int maxlen = src->get_remaining_size() / (2 * _desired_channels);
00113 if (n > maxlen) n = maxlen;
00114 int words = n * _desired_channels;
00115 for (int i=0; i<words; i++) {
00116 _data.push_back(src->get_int16());
00117 }
00118 }
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 void UserDataAudio::
00130 append(const string &str) {
00131 nassertv(!_aborted);
00132 int samples = str.size() / (2 * _desired_channels);
00133 int words = samples * _desired_channels;
00134 for (int i=0; i<words; i++) {
00135 int c1 = ((unsigned char)str[i*2+0]);
00136 int c2 = ((unsigned char)str[i*2+1]);
00137 PN_int16 n = (c1 | (c2 << 8));
00138 _data.push_back(n);
00139 }
00140 }
00141
00142
00143
00144
00145
00146
00147
00148 void UserDataAudio::
00149 done() {
00150 _aborted = true;
00151 }