00001 #include "audio1394.h"
00002 #include "playbackconfig.h"
00003 #include "device1394input.h"
00004 #include "device1394output.h"
00005 #include "iec61883input.h"
00006 #include "iec61883output.h"
00007 #include "preferences.h"
00008 #include "recordconfig.h"
00009 #include "videoconfig.h"
00010 #include "videodevice.h"
00011
00012 #define SAMPLES_PER_FRAME 2048
00013
00014 Audio1394::Audio1394(AudioDevice *device)
00015 : AudioLowLevel(device)
00016 {
00017 initialize();
00018 }
00019
00020
00021 Audio1394::~Audio1394()
00022 {
00023 close_all();
00024 }
00025
00026 int Audio1394::initialize()
00027 {
00028 input_thread = 0;
00029 output_thread = 0;
00030 input_iec = 0;
00031 output_iec = 0;
00032 }
00033
00034 int Audio1394::open_input()
00035 {
00036 int result = 0;
00037 if(!input_thread && !input_iec)
00038 {
00039
00040 device->in_channels = 2;
00041 device->in_bits = 16;
00042 bytes_per_sample = device->in_channels * device->in_bits / 8;
00043
00044
00045 if(device->driver == AUDIO_DV1394 ||
00046 device->driver == AUDIO_1394)
00047 {
00048 input_thread = new Device1394Input;
00049 result = input_thread->open(device->in_config->firewire_path,
00050 device->in_config->firewire_port,
00051 device->in_config->firewire_channel,
00052 30,
00053 device->in_channels,
00054 device->in_samplerate,
00055 device->in_bits,
00056 device->vconfig->w,
00057 device->vconfig->h);
00058 }
00059 else
00060 {
00061 input_iec = new IEC61883Input;
00062 result = input_iec->open(device->in_config->firewire_port,
00063 device->in_config->firewire_channel,
00064 30,
00065 device->in_channels,
00066 device->in_samplerate,
00067 device->in_bits,
00068 device->vconfig->w,
00069 device->vconfig->h);
00070 }
00071
00072
00073
00074
00075 if(result)
00076 {
00077 delete input_thread;
00078 input_thread = 0;
00079 delete input_iec;
00080 input_iec = 0;
00081 }
00082 }
00083
00084 return result;
00085 }
00086
00087 int Audio1394::open_output()
00088 {
00089 if(!output_thread && !output_iec)
00090 {
00091
00092 device->out_channels = 2;
00093 device->out_bits = 16;
00094 bytes_per_sample = device->out_channels * device->out_bits / 8;
00095
00096
00097 if(device->driver == AUDIO_DV1394)
00098 {
00099 output_thread = new Device1394Output(device);
00100 output_thread->open(device->out_config->dv1394_path,
00101 device->out_config->dv1394_port,
00102 device->out_config->dv1394_channel,
00103 30,
00104 device->out_channels,
00105 device->out_bits,
00106 device->out_samplerate,
00107 device->out_config->dv1394_syt);
00108 }
00109 else
00110 if(device->driver == AUDIO_1394)
00111 {
00112 output_thread = new Device1394Output(device);
00113 output_thread->open(device->out_config->firewire_path,
00114 device->out_config->firewire_port,
00115 device->out_config->firewire_channel,
00116 30,
00117 device->out_channels,
00118 device->out_bits,
00119 device->out_samplerate,
00120 device->out_config->firewire_syt);
00121 }
00122 else
00123 {
00124 output_iec = new IEC61883Output(device);
00125 output_iec->open(device->out_config->firewire_port,
00126 device->out_config->firewire_channel,
00127 30,
00128 device->out_channels,
00129 device->out_bits,
00130 device->out_samplerate,
00131 device->out_config->firewire_syt);
00132 }
00133 }
00134 return 0;
00135 }
00136
00137 int Audio1394::close_all()
00138 {
00139 if(input_thread)
00140 {
00141 delete input_thread;
00142 }
00143
00144 if(output_thread)
00145 {
00146 delete output_thread;
00147 }
00148 delete input_iec;
00149 delete output_iec;
00150
00151 initialize();
00152 return 0;
00153 }
00154
00155
00156 int Audio1394::read_buffer(char *buffer, int bytes)
00157 {
00158 if(input_thread)
00159 {
00160 input_thread->read_audio(buffer, bytes / bytes_per_sample);
00161 }
00162 else
00163 if(input_iec)
00164 {
00165 input_iec->read_audio(buffer, bytes / bytes_per_sample);
00166 }
00167
00168 return 0;
00169 }
00170
00171 int Audio1394::write_buffer(char *buffer, int bytes)
00172 {
00173 if(output_thread)
00174 output_thread->write_samples(buffer, bytes / bytes_per_sample);
00175 else
00176 if(output_iec)
00177 output_iec->write_samples(buffer, bytes / bytes_per_sample);
00178 return 0;
00179 }
00180
00181 int64_t Audio1394::device_position()
00182 {
00183 if(output_thread)
00184 return output_thread->get_audio_position();
00185 else
00186 if(output_iec)
00187 return output_iec->get_audio_position();
00188 else
00189 return 0;
00190 }
00191
00192
00193 int Audio1394::flush_device()
00194 {
00195 if(output_thread)
00196 output_thread->flush();
00197 else
00198 if(output_iec)
00199 output_iec->flush();
00200 return 0;
00201 }
00202
00203 int Audio1394::interrupt_playback()
00204 {
00205 if(output_thread)
00206 output_thread->interrupt();
00207 else
00208 if(output_iec)
00209 output_iec->interrupt();
00210 return 0;
00211 }