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