diff options
Diffstat (limited to 'gr-audio')
23 files changed, 69 insertions, 67 deletions
diff --git a/gr-audio/CMakeLists.txt b/gr-audio/CMakeLists.txt index 1da6635ec0..9aa343b45e 100644 --- a/gr-audio/CMakeLists.txt +++ b/gr-audio/CMakeLists.txt @@ -28,7 +28,7 @@ include(GrBoost) include(GrComponent) GR_REGISTER_COMPONENT("gr-audio" ENABLE_GR_AUDIO Boost_FOUND - ENABLE_GR_CORE + ENABLE_GNURADIO_RUNTIME ) GR_SET_GLOBAL(GR_AUDIO_INCLUDE_DIRS diff --git a/gr-audio/examples/c++/CMakeLists.txt b/gr-audio/examples/c++/CMakeLists.txt index ee98f78e72..d383008011 100644 --- a/gr-audio/examples/c++/CMakeLists.txt +++ b/gr-audio/examples/c++/CMakeLists.txt @@ -20,8 +20,7 @@ include_directories( ${GR_AUDIO_INCLUDE_DIRS} ${GR_ANALOG_INCLUDE_DIRS} - ${GNURADIO_CORE_INCLUDE_DIRS} - ${GRUEL_INCLUDE_DIRS} + ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) diff --git a/gr-audio/examples/grc/cvsd_sweep.grc b/gr-audio/examples/grc/cvsd_sweep.grc index 2fb4c4cc7b..00da399da1 100644 --- a/gr-audio/examples/grc/cvsd_sweep.grc +++ b/gr-audio/examples/grc/cvsd_sweep.grc @@ -111,7 +111,7 @@ </param> </block> <block> - <key>gr_vco_f</key> + <key>blocks_vco_f</key> <param> <key>id</key> <value>vco</value> @@ -520,7 +520,7 @@ </param> <param> <key>trig_mode</key> - <value>gr.gr_TRIG_MODE_AUTO</value> + <value>wxgui.TRIG_MODE_AUTO</value> </param> <param> <key>y_axis_label</key> @@ -595,7 +595,7 @@ </param> <param> <key>trig_mode</key> - <value>gr.gr_TRIG_MODE_AUTO</value> + <value>wxgui.TRIG_MODE_AUTO</value> </param> <param> <key>y_axis_label</key> @@ -761,7 +761,7 @@ </param> <param> <key>trig_mode</key> - <value>gr.gr_TRIG_MODE_AUTO</value> + <value>wxgui.TRIG_MODE_AUTO</value> </param> <param> <key>y_axis_label</key> diff --git a/gr-audio/examples/python/audio_play.py b/gr-audio/examples/python/audio_play.py index 465590f69f..94ea72498d 100755 --- a/gr-audio/examples/python/audio_play.py +++ b/gr-audio/examples/python/audio_play.py @@ -22,6 +22,7 @@ from gnuradio import gr from gnuradio import audio +from gnuradio import blocks from gnuradio.eng_option import eng_option from optparse import OptionParser @@ -45,7 +46,7 @@ class my_top_block(gr.top_block): raise SystemExit, 1 sample_rate = int(options.sample_rate) - src = gr.file_source (gr.sizeof_float, options.filename, options.repeat) + src = blocks.file_source (gr.sizeof_float, options.filename, options.repeat) dst = audio.sink (sample_rate, options.audio_output) self.connect(src, dst) diff --git a/gr-audio/examples/python/audio_to_file.py b/gr-audio/examples/python/audio_to_file.py index 3f7a4f8d1c..6a2cbcb12e 100755 --- a/gr-audio/examples/python/audio_to_file.py +++ b/gr-audio/examples/python/audio_to_file.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2004,2007 Free Software Foundation, Inc. +# Copyright 2004,2007,2013 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -22,6 +22,7 @@ from gnuradio import gr from gnuradio import audio +from gnuradio import blocks from gnuradio.eng_option import eng_option from optparse import OptionParser @@ -47,12 +48,12 @@ class my_top_block(gr.top_block): sample_rate = int(options.sample_rate) src = audio.source (sample_rate, options.audio_input) - dst = gr.file_sink (gr.sizeof_float, filename) + dst = blocks.file_sink (gr.sizeof_float, filename) if options.nsamples is None: self.connect((src, 0), dst) else: - head = gr.head(gr.sizeof_float, int(options.nsamples)) + head = blocks.head(gr.sizeof_float, int(options.nsamples)) self.connect((src, 0), head, dst) diff --git a/gr-audio/examples/python/dial_tone_wav.py b/gr-audio/examples/python/dial_tone_wav.py index 4d8d6b4019..82f8cf331d 100755 --- a/gr-audio/examples/python/dial_tone_wav.py +++ b/gr-audio/examples/python/dial_tone_wav.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2004,2005,2007,2008,2012 Free Software Foundation, Inc. +# Copyright 2004,2005,2007,2008,2012,2013 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -23,6 +23,7 @@ # GNU Radio example program to record a dial tone to a WAV file from gnuradio import gr +from gnuradio import blocks from gnuradio.eng_option import eng_option from optparse import OptionParser @@ -53,9 +54,9 @@ class my_top_block(gr.top_block): src0 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 350, ampl) src1 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 440, ampl) - head0 = gr.head(gr.sizeof_float, int(options.samples)) - head1 = gr.head(gr.sizeof_float, int(options.samples)) - dst = gr.wavfile_sink(args[0], 2, int(options.sample_rate), 16) + head0 = blocks.head(gr.sizeof_float, int(options.samples)) + head1 = blocks.head(gr.sizeof_float, int(options.samples)) + dst = blocks.wavfile_sink(args[0], 2, int(options.sample_rate), 16) self.connect(src0, head0, (dst, 0)) self.connect(src1, head1, (dst, 1)) diff --git a/gr-audio/examples/python/noise.py b/gr-audio/examples/python/noise.py index bba9e83eae..b15065cd4e 100755 --- a/gr-audio/examples/python/noise.py +++ b/gr-audio/examples/python/noise.py @@ -44,7 +44,7 @@ class my_top_block(gr.top_block): sample_rate = int(options.sample_rate) ampl = 0.1 - src = gr.glfsr_source_b(32) # Pseudorandom noise source + src = digital.glfsr_source_b(32) # Pseudorandom noise source b2f = digital.chunks_to_symbols_bf([ampl, -ampl], 1) dst = audio.sink(sample_rate, options.audio_output) self.connect(src, b2f, dst) diff --git a/gr-audio/examples/python/spectrum_inversion.py b/gr-audio/examples/python/spectrum_inversion.py index 63d0c8cc8d..a02d6c5821 100755 --- a/gr-audio/examples/python/spectrum_inversion.py +++ b/gr-audio/examples/python/spectrum_inversion.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2004,2005,2007 Free Software Foundation, Inc. +# Copyright 2004,2005,2007,2013 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -54,7 +54,7 @@ class my_top_block(gr.top_block): dst = audio.sink (sample_rate, options.audio_output) vec1 = [1, -1] - vsource = gr.vector_source_f(vec1, True) + vsource = blocks.vector_source_f(vec1, True) multiply = blocks.multiply_ff() self.connect(src, (multiply, 0)) diff --git a/gr-audio/examples/python/test_resampler.py b/gr-audio/examples/python/test_resampler.py index 0f5544cfa9..94d95fecf3 100755 --- a/gr-audio/examples/python/test_resampler.py +++ b/gr-audio/examples/python/test_resampler.py @@ -22,6 +22,7 @@ from gnuradio import gr, gru from gnuradio import audio +from gnuradio import filter from gnuradio.eng_option import eng_option from optparse import OptionParser @@ -65,7 +66,7 @@ class my_top_block(gr.top_block): ampl = 0.1 src0 = analog.sig_source_f(input_rate, analog.GR_SIN_WAVE, 650, ampl) - rr = blocks.rational_resampler_fff(interp, decim) + rr = filter.rational_resampler_fff(interp, decim) dst = audio.sink(output_rate, options.audio_output) self.connect(src0, rr, (dst, 0)) diff --git a/gr-audio/gnuradio-audio.pc.in b/gr-audio/gnuradio-audio.pc.in index 1cd6d40513..c7c91b814e 100644 --- a/gr-audio/gnuradio-audio.pc.in +++ b/gr-audio/gnuradio-audio.pc.in @@ -5,7 +5,7 @@ includedir=@includedir@ Name: gnuradio-audio Description: The GNU Radio block for all supported audio sound systems -Requires: gnuradio-core +Requires: gnuradio-runtime Version: @LIBVER@ Libs: -L${libdir} -lgnuradio-audio Cflags: -I${includedir} diff --git a/gr-audio/include/audio/api.h b/gr-audio/include/audio/api.h index 2ddd0fec6e..1c113c92ba 100644 --- a/gr-audio/include/audio/api.h +++ b/gr-audio/include/audio/api.h @@ -22,7 +22,7 @@ #ifndef INCLUDED_GR_AUDIO_API_H #define INCLUDED_GR_AUDIO_API_H -#include <gruel/attributes.h> +#include <attributes.h> #ifdef gnuradio_audio_EXPORTS # define GR_AUDIO_API __GR_ATTR_EXPORT diff --git a/gr-audio/lib/CMakeLists.txt b/gr-audio/lib/CMakeLists.txt index 86c553c735..3e29319ebb 100644 --- a/gr-audio/lib/CMakeLists.txt +++ b/gr-audio/lib/CMakeLists.txt @@ -23,16 +23,15 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${GR_AUDIO_INCLUDE_DIRS} - ${GNURADIO_CORE_INCLUDE_DIRS} - ${GRUEL_INCLUDE_DIRS} - ${LOG4CXX_INCLUDE_DIRS} + ${GNURADIO_RUNTIME_INCLUDE_DIRS} + ${LOG4CPP_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) link_directories(${Boost_LIBRARY_DIRS}) -link_directories(${LOG4CXX_LIBRARY_DIRS}) +link_directories(${LOG4CPP_LIBRARY_DIRS}) -list(APPEND gr_audio_libs gnuradio-core ${Boost_LIBRARIES} ${LOG4CXX_LIBRARIES}) +list(APPEND gr_audio_libs gnuradio-runtime ${Boost_LIBRARIES} ${LOG4CPP_LIBRARIES}) list(APPEND gr_audio_sources audio_registry.cc) list(APPEND gr_audio_confs ${CMAKE_CURRENT_SOURCE_DIR}/gr-audio.conf) diff --git a/gr-audio/lib/osx/circular_buffer.h b/gr-audio/lib/osx/circular_buffer.h index 65788d482c..7abbeaeb0c 100644 --- a/gr-audio/lib/osx/circular_buffer.h +++ b/gr-audio/lib/osx/circular_buffer.h @@ -23,7 +23,7 @@ #ifndef _CIRCULAR_BUFFER_H_ #define _CIRCULAR_BUFFER_H_ -#include <gruel/thread.h> +#include <thread/thread.h> #include <iostream> #include <stdexcept> @@ -49,9 +49,9 @@ private: size_t d_n_avail_write_I, d_n_avail_read_I; // stuff to control access to class internals - gruel::mutex* d_internal; - gruel::condition_variable* d_readBlock; - gruel::condition_variable* d_writeBlock; + gr::thread::mutex* d_internal; + gr::thread::condition_variable* d_readBlock; + gr::thread::condition_variable* d_writeBlock; // booleans to decide how to control reading, writing, and aborting bool d_doWriteBlock, d_doFullRead, d_doAbort; @@ -96,13 +96,13 @@ public: }; inline size_t n_avail_write_items () { - gruel::scoped_lock l (*d_internal); + gr::thread::scoped_lock l (*d_internal); size_t retVal = d_n_avail_write_I; return (retVal); }; inline size_t n_avail_read_items () { - gruel::scoped_lock l (*d_internal); + gr::thread::scoped_lock l (*d_internal); size_t retVal = d_n_avail_read_I; return (retVal); }; @@ -120,13 +120,13 @@ public: // create a mutex to handle contention of shared resources; // any routine needed access to shared resources uses lock() // before doing anything, then unlock() when finished. - d_internal = new gruel::mutex (); + d_internal = new gr::thread::mutex (); // link the internal mutex to the read and write conditions; // when wait() is called, the internal mutex will automatically // be unlock()'ed. Upon return (from a notify_one() to the condition), // the internal mutex will be lock()'ed. - d_readBlock = new gruel::condition_variable (); - d_writeBlock = new gruel::condition_variable (); + d_readBlock = new gr::thread::condition_variable (); + d_writeBlock = new gr::thread::condition_variable (); }; /* @@ -167,7 +167,7 @@ public: if (!buf) throw std::runtime_error ("circular_buffer::enqueue(): " "input buffer is NULL.\n"); - gruel::scoped_lock l (*d_internal); + gr::thread::scoped_lock l (*d_internal); if (d_doAbort) { return (2); } @@ -253,7 +253,7 @@ public: throw std::runtime_error ("circular_buffer::dequeue()"); } - gruel::scoped_lock l (*d_internal); + gr::thread::scoped_lock l (*d_internal); if (d_doAbort) { return (2); } @@ -305,7 +305,7 @@ public: }; void abort () { - gruel::scoped_lock l (*d_internal); + gr::thread::scoped_lock l (*d_internal); d_doAbort = true; d_writeBlock->notify_one (); d_readBlock->notify_one (); diff --git a/gr-audio/lib/osx/osx_sink.cc b/gr-audio/lib/osx/osx_sink.cc index ace96ec742..b7fe4e9d11 100644 --- a/gr-audio/lib/osx/osx_sink.cc +++ b/gr-audio/lib/osx/osx_sink.cc @@ -188,12 +188,12 @@ namespace gr { // create the stuff to regulate I/O - d_cond_data = new gruel::condition_variable(); + d_cond_data = new gr::thread::condition_variable(); if(d_cond_data == NULL) CheckErrorAndThrow(errno, "new condition (data)", "audio_osx_sink::audio_osx_sink"); - d_internal = new gruel::mutex(); + d_internal = new gr::thread::mutex(); if(d_internal == NULL) CheckErrorAndThrow(errno, "new mutex (internal)", "audio_osx_sink::audio_osx_sink"); @@ -288,7 +288,7 @@ namespace gr { gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - gruel::scoped_lock l(*d_internal); + gr::thread::scoped_lock l(*d_internal); /* take the input data, copy it, and push it to the bottom of the queue mono input are pushed onto queue[0]; @@ -386,7 +386,7 @@ namespace gr { osx_sink* This = (osx_sink*)inRefCon; OSStatus err = noErr; - gruel::scoped_lock l(*This->d_internal); + gr::thread::scoped_lock l(*This->d_internal); #if _OSX_AU_DEBUG_ std::cerr << "cb_in: SC = " << This->d_queueSampleCount diff --git a/gr-audio/lib/osx/osx_sink.h b/gr-audio/lib/osx/osx_sink.h index 6bbd882239..153d2d76e6 100644 --- a/gr-audio/lib/osx/osx_sink.h +++ b/gr-audio/lib/osx/osx_sink.h @@ -47,8 +47,8 @@ namespace gr { UInt32 d_n_channels; UInt32 d_queueSampleCount, d_max_sample_count; bool d_do_block; - gruel::mutex* d_internal; - gruel::condition_variable* d_cond_data; + gr::thread::mutex* d_internal; + gr::thread::condition_variable* d_cond_data; circular_buffer<float>** d_buffers; // AudioUnits and Such diff --git a/gr-audio/lib/osx/osx_source.cc b/gr-audio/lib/osx/osx_source.cc index c79a6ec6e9..c666bb7ad8 100644 --- a/gr-audio/lib/osx/osx_source.cc +++ b/gr-audio/lib/osx/osx_source.cc @@ -484,12 +484,12 @@ namespace gr { // create the stuff to regulate I/O - d_cond_data = new gruel::condition_variable(); + d_cond_data = new gr::thread::condition_variable(); if(d_cond_data == NULL) CheckErrorAndThrow(errno, "new condition (data)", "audio_osx_source::audio_osx_source"); - d_internal = new gruel::mutex(); + d_internal = new gr::thread::mutex(); if(d_internal == NULL) CheckErrorAndThrow(errno, "new mutex (internal)", "audio_osx_source::audio_osx_source"); @@ -687,7 +687,7 @@ namespace gr { gr_vector_void_star &output_items) { // acquire control to do processing here only - gruel::scoped_lock l(*d_internal); + gr::thread::scoped_lock l(*d_internal); #if _OSX_AU_DEBUG_ std::cerr << "work1: SC = " << d_queueSampleCount @@ -806,7 +806,7 @@ namespace gr { OSStatus err = noErr; osx_source* This = static_cast<osx_source*>(inRefCon); - gruel::scoped_lock l(*This->d_internal); + gr::thread::scoped_lock l(*This->d_internal); #if _OSX_AU_DEBUG_ std::cerr << "cb0: in#F = " << inNumberFrames diff --git a/gr-audio/lib/osx/osx_source.h b/gr-audio/lib/osx/osx_source.h index 9315c8e44e..03a2d8879c 100644 --- a/gr-audio/lib/osx/osx_source.h +++ b/gr-audio/lib/osx/osx_source.h @@ -53,8 +53,8 @@ namespace gr { UInt32 d_n_AvailableInputFrames, d_n_ActualInputFrames; UInt32 d_n_user_channels, d_n_max_channels, d_n_deviceChannels; bool d_do_block, d_passThrough, d_waiting_for_data; - gruel::mutex* d_internal; - gruel::condition_variable* d_cond_data; + gr::thread::mutex* d_internal; + gr::thread::condition_variable* d_cond_data; circular_buffer<float>** d_buffers; // AudioUnits and Such diff --git a/gr-audio/lib/portaudio/portaudio_sink.cc b/gr-audio/lib/portaudio/portaudio_sink.cc index d1a3f5166c..746894e494 100644 --- a/gr-audio/lib/portaudio/portaudio_sink.cc +++ b/gr-audio/lib/portaudio/portaudio_sink.cc @@ -100,7 +100,7 @@ namespace gr { if(nreqd_samples <= navail_samples) { // We've got enough data... { - gruel::scoped_lock guard(self->d_ringbuffer_mutex); + gr::thread::scoped_lock guard(self->d_ringbuffer_mutex); memcpy(outputBuffer, self->d_reader->read_pointer(), @@ -313,7 +313,7 @@ namespace gr { if(nframes == 0) { // no room... if(d_ok_to_block) { { - gruel::scoped_lock guard(d_ringbuffer_mutex); + gr::thread::scoped_lock guard(d_ringbuffer_mutex); while(!d_ringbuffer_ready) d_ringbuffer_cond.wait(guard); } @@ -331,7 +331,7 @@ namespace gr { // We can write the smaller of the request and the room we've got { - gruel::scoped_lock guard(d_ringbuffer_mutex); + gr::thread::scoped_lock guard(d_ringbuffer_mutex); int nf = std::min(noutput_items - k, nframes); float *p = (float*)d_writer->write_pointer(); diff --git a/gr-audio/lib/portaudio/portaudio_sink.h b/gr-audio/lib/portaudio/portaudio_sink.h index 41a725b691..e69f96b252 100644 --- a/gr-audio/lib/portaudio/portaudio_sink.h +++ b/gr-audio/lib/portaudio/portaudio_sink.h @@ -24,7 +24,7 @@ #include <audio/sink.h> #include <gr_buffer.h> -#include <gruel/thread.h> +#include <thread/thread.h> #include <string> #include <portaudio.h> #include <stdexcept> @@ -58,8 +58,8 @@ namespace gr { gr_buffer_sptr d_writer; // buffer used between work and callback gr_buffer_reader_sptr d_reader; - gruel::mutex d_ringbuffer_mutex; - gruel::condition_variable d_ringbuffer_cond; + gr::thread::mutex d_ringbuffer_mutex; + gr::thread::condition_variable d_ringbuffer_cond; bool d_ringbuffer_ready; // random stats diff --git a/gr-audio/lib/portaudio/portaudio_source.cc b/gr-audio/lib/portaudio/portaudio_source.cc index 937c1d0dbf..500d3109e5 100644 --- a/gr-audio/lib/portaudio/portaudio_source.cc +++ b/gr-audio/lib/portaudio/portaudio_source.cc @@ -103,7 +103,7 @@ namespace gr { // copy from input buffer to ringbuffer { - gruel::scoped_lock(d_ringbuffer_mutex); + gr::thread::scoped_lock(d_ringbuffer_mutex); memcpy(self->d_writer->write_pointer(), inputBuffer, @@ -305,7 +305,7 @@ namespace gr { return k; if(d_ok_to_block) { - gruel::scoped_lock guard(d_ringbuffer_mutex); + gr::thread::scoped_lock guard(d_ringbuffer_mutex); while(d_ringbuffer_ready == false) d_ringbuffer_cond.wait(guard); // block here, then try again continue; @@ -324,7 +324,7 @@ namespace gr { // Fill with some frames of zeros { - gruel::scoped_lock guard(d_ringbuffer_mutex); + gr::thread::scoped_lock guard(d_ringbuffer_mutex); int nf = std::min(noutput_items - k, (int)d_portaudio_buffer_size_frames); for(int i = 0; i < nf; i++) { @@ -341,7 +341,7 @@ namespace gr { // We can read the smaller of the request and what's in the buffer. { - gruel::scoped_lock guard(d_ringbuffer_mutex); + gr::thread::scoped_lock guard(d_ringbuffer_mutex); int nf = std::min(noutput_items - k, nframes); diff --git a/gr-audio/lib/portaudio/portaudio_source.h b/gr-audio/lib/portaudio/portaudio_source.h index d4f4f01d1f..6a3419b613 100644 --- a/gr-audio/lib/portaudio/portaudio_source.h +++ b/gr-audio/lib/portaudio/portaudio_source.h @@ -25,7 +25,7 @@ #include <audio/source.h> #include <gr_buffer.h> -#include <gruel/thread.h> +#include <thread/thread.h> #include <string> #include <portaudio.h> #include <stdexcept> @@ -58,8 +58,8 @@ namespace gr { gr_buffer_sptr d_writer; // buffer used between work and callback gr_buffer_reader_sptr d_reader; - gruel::mutex d_ringbuffer_mutex; - gruel::condition_variable d_ringbuffer_cond; + gr::thread::mutex d_ringbuffer_mutex; + gr::thread::condition_variable d_ringbuffer_cond; bool d_ringbuffer_ready; // random stats diff --git a/gr-audio/swig/CMakeLists.txt b/gr-audio/swig/CMakeLists.txt index 4f98328a7b..a9a5412c78 100644 --- a/gr-audio/swig/CMakeLists.txt +++ b/gr-audio/swig/CMakeLists.txt @@ -25,13 +25,13 @@ include(GrSwig) set(GR_SWIG_INCLUDE_DIRS ${GR_AUDIO_INCLUDE_DIRS} - ${GNURADIO_CORE_SWIG_INCLUDE_DIRS} - ${GRUEL_INCLUDE_DIRS} + ${GNURADIO_RUNTIME_SWIG_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/audio_swig_doc.i) -set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include) +set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include/audio) +set(GR_SWIG_DOCS_TARGET_DEPS runtime_swig_swig_doc) set(GR_SWIG_LIBRARIES gnuradio-audio) diff --git a/gr-audio/swig/audio_swig.i b/gr-audio/swig/audio_swig.i index 449fb5da51..d675df0f95 100644 --- a/gr-audio/swig/audio_swig.i +++ b/gr-audio/swig/audio_swig.i @@ -22,7 +22,7 @@ #define GR_AUDIO_API -%include "gnuradio.i" +%include "runtime_swig.i" //load generated python docstrings %include "audio_swig_doc.i" |