aKode is a simple audio decoding framework that provides a uniform interface
authorhasso <hasso>
Thu, 26 Feb 2009 18:00:34 +0000 (18:00 +0000)
committerhasso <hasso>
Thu, 26 Feb 2009 18:00:34 +0000 (18:00 +0000)
to decode the most common audio formats. It also has a direct playback option
for a number of audio outputs.

This package provides the aKode library and akodeplay testing utility.

15 files changed:
audio/akode/DESCR [new file with mode: 0644]
audio/akode/Makefile [new file with mode: 0644]
audio/akode/Makefile.common [new file with mode: 0644]
audio/akode/PLIST [new file with mode: 0644]
audio/akode/buildlink3.mk [new file with mode: 0644]
audio/akode/distinfo [new file with mode: 0644]
audio/akode/patches/patch-aa [new file with mode: 0644]
audio/akode/patches/patch-ab [new file with mode: 0644]
audio/akode/patches/patch-ac [new file with mode: 0644]
audio/akode/patches/patch-ad [new file with mode: 0644]
audio/akode/patches/patch-ae [new file with mode: 0644]
audio/akode/patches/patch-af [new file with mode: 0644]
audio/akode/patches/patch-ag [new file with mode: 0644]
audio/akode/patches/patch-ah [new file with mode: 0644]
audio/akode/patches/patch-ai [new file with mode: 0644]

diff --git a/audio/akode/DESCR b/audio/akode/DESCR
new file mode 100644 (file)
index 0000000..cea5a76
--- /dev/null
@@ -0,0 +1,5 @@
+aKode is a simple audio decoding framework that provides a uniform interface
+to decode the most common audio formats. It also has a direct playback option
+for a number of audio outputs.
+
+This package provides the aKode library and akodeplay testing utility.
diff --git a/audio/akode/Makefile b/audio/akode/Makefile
new file mode 100644 (file)
index 0000000..62acd9a
--- /dev/null
@@ -0,0 +1,15 @@
+# $NetBSD$
+#
+
+PKGNAME=               akode-2.0.2
+PKGREVISION=           1
+
+MAINTAINER=            hasso@NetBSD.org
+COMMENT=               Simple audio decoding framework (base package)
+
+.include "../../audio/akode/Makefile.common"
+
+PKG_DESTDIR_SUPPORT=   user-destdir
+
+.include "../../devel/libltdl/buildlink3.mk"
+.include "../../mk/bsd.pkg.mk"
diff --git a/audio/akode/Makefile.common b/audio/akode/Makefile.common
new file mode 100644 (file)
index 0000000..4ad238e
--- /dev/null
@@ -0,0 +1,42 @@
+# $NetBSD: Makefile,v 1.3 2008/12/05 14:03:53 htepper Exp $
+#
+# used by audio/akode/Makefile
+# used by audio/akode-plugins-alsa/Makefile
+# used by audio/akode-plugins-ffmpeg/Makefile
+# used by audio/akode-plugins-jack/Makefile
+# used by audio/akode-plugins-mpc/Makefile
+# used by audio/akode-plugins-mpeg/Makefile
+# used by audio/akode-plugins-oss/Makefile
+# used by audio/akode-plugins-pulseaudio/Makefile
+# used by audio/akode-plugins-resampler/Makefile
+# used by audio/akode-plugins-sun/Makefile
+# used by audio/akode-plugins-xiph/Makefile
+
+AKODE_VERSION=         2.0.2
+DISTNAME=              30375-akode-${AKODE_VERSION}
+CATEGORIES=            audio
+MASTER_SITES=          http://www.kde-apps.org/CONTENT/content-files/
+EXTRACT_SUFX=          .tar.bz2
+
+MAINTAINER=            hasso@NetBSD.org
+HOMEPAGE=              http://carewolf.com/akode/
+
+WRKSRC=                        ${WRKDIR}/akode-${AKODE_VERSION}
+
+GNU_CONFIGURE=         yes
+USE_TOOLS+=            gmake pkg-config
+USE_LANGUAGES=         c c++
+USE_LIBTOOL=           yes
+
+CONFIGURE_ARGS+=        --without-flac
+CONFIGURE_ARGS+=        --without-speex
+CONFIGURE_ARGS+=        --without-libmad
+CONFIGURE_ARGS+=        --without-libsamplerate
+CONFIGURE_ARGS+=        --without-jack
+CONFIGURE_ARGS+=        --without-polypaudio
+CONFIGURE_ARGS+=        --without-ffmpeg
+CONFIGURE_ARGS+=        --without-oss
+CONFIGURE_ARGS+=        --without-sun
+CONFIGURE_ARGS+=        --without-alsa
+CONFIGURE_ARGS+=        --without-vorbis
+CONFIGURE_ARGS+=       --without-mpc
diff --git a/audio/akode/PLIST b/audio/akode/PLIST
new file mode 100644 (file)
index 0000000..9731320
--- /dev/null
@@ -0,0 +1,30 @@
+@comment $NetBSD$
+bin/akode-config
+bin/akodeplay
+include/akode/akode_export.h
+include/akode/akodelib.h
+include/akode/audiobuffer.h
+include/akode/audioconfiguration.h
+include/akode/audioframe.h
+include/akode/auto_sink.h
+include/akode/buffered_decoder.h
+include/akode/bytebuffer.h
+include/akode/converter.h
+include/akode/crossfader.h
+include/akode/decoder.h
+include/akode/encoder.h
+include/akode/fast_resampler.h
+include/akode/file.h
+include/akode/framedecoder.h
+include/akode/localfile.h
+include/akode/magic.h
+include/akode/mmapfile.h
+include/akode/player.h
+include/akode/pluginhandler.h
+include/akode/resampler.h
+include/akode/sink.h
+include/akode/void_sink.h
+include/akode/volumefilter.h
+include/akode/wav_decoder.h
+lib/libakode.la
+@dirrm include/akode
diff --git a/audio/akode/buildlink3.mk b/audio/akode/buildlink3.mk
new file mode 100644 (file)
index 0000000..02e6dbf
--- /dev/null
@@ -0,0 +1,21 @@
+# $NetBSD$
+
+BUILDLINK_DEPTH:=      ${BUILDLINK_DEPTH}+
+AKODE_BUILDLINK3_MK:=  ${AKODE_BUILDLINK3_MK}+
+
+.if !empty(BUILDLINK_DEPTH:M+)
+BUILDLINK_DEPENDS+=    akode
+.endif
+
+BUILDLINK_PACKAGES:=   ${BUILDLINK_PACKAGES:Nakode}
+BUILDLINK_PACKAGES+=   akode
+BUILDLINK_ORDER:=      ${BUILDLINK_ORDER} ${BUILDLINK_DEPTH}akode
+
+.if !empty(AKODE_BUILDLINK3_MK:M+)
+BUILDLINK_API_DEPENDS.akode+=  akode>=2.0.2
+BUILDLINK_PKGSRCDIR.akode?=    ../../akode/akode
+.endif # AKODE_BUILDLINK3_MK
+
+.include "../../devel/libltdl/buildlink3.mk"
+
+BUILDLINK_DEPTH:=      ${BUILDLINK_DEPTH:S/+$//}
diff --git a/audio/akode/distinfo b/audio/akode/distinfo
new file mode 100644 (file)
index 0000000..52f7b1c
--- /dev/null
@@ -0,0 +1,14 @@
+$NetBSD$
+
+SHA1 (30375-akode-2.0.2.tar.bz2) = 10ad1e335bc53c2a90d133b493568324514c729c
+RMD160 (30375-akode-2.0.2.tar.bz2) = fa0322367d8e24e541007d3f9e508c3c31370d96
+Size (30375-akode-2.0.2.tar.bz2) = 472605 bytes
+SHA1 (patch-aa) = e984dc5d4f1e62812d8c0c9db4bf0476c1edf3fa
+SHA1 (patch-ab) = 0366386429f06655aabd3dbfd393182856750cc6
+SHA1 (patch-ac) = 16ecd5bddc4a8490703380f06cf25abf54a2f99e
+SHA1 (patch-ad) = b1e110ed925fd35714e0baf89a7ce485496fd0a6
+SHA1 (patch-ae) = e1b8b9439907a92531c1e0a0c4b494bd7776f770
+SHA1 (patch-af) = 99f17f5d3a58ad659a1a8c4dab5ddf6b5382dbff
+SHA1 (patch-ag) = 5c3cb7d81af525f1816cd4489ff5097a8457a91e
+SHA1 (patch-ah) = f58249f5d32e86e82a5831a826dafc0590653a5e
+SHA1 (patch-ai) = 0b1196a792259ed573c964f66b68f56adb8a4b0e
diff --git a/audio/akode/patches/patch-aa b/audio/akode/patches/patch-aa
new file mode 100644 (file)
index 0000000..33daaf0
--- /dev/null
@@ -0,0 +1,13 @@
+$NetBSD$
+
+--- akode/plugins/xiph_decoder/flac113_decoder.cpp.orig        2008-12-05 15:27:25 +0200
++++ akode/plugins/xiph_decoder/flac113_decoder.cpp     2008-12-05 15:27:44 +0200
+@@ -108,7 +108,7 @@ struct FLACDecoder::private_data {
+ static FLAC__StreamDecoderReadStatus flac_read_callback(
+         const FLAC__StreamDecoder *,
+         FLAC__byte buffer[],
+-        unsigned *bytes,
++        size_t *bytes,
+         void *client_data)
+ {
+     FLACDecoder::private_data *data = (FLACDecoder::private_data*)client_data;
diff --git a/audio/akode/patches/patch-ab b/audio/akode/patches/patch-ab
new file mode 100644 (file)
index 0000000..444d926
--- /dev/null
@@ -0,0 +1,30 @@
+$NetBSD$
+
+--- akode/plugins/sun_sink/sun_sink.cpp.orig   2008-12-06 21:32:50 +0200
++++ akode/plugins/sun_sink/sun_sink.cpp        2008-12-06 21:39:31 +0200
+@@ -20,13 +20,14 @@
+ #include <config.h>
++#include <sys/types.h>
++#include <sys/ioctl.h>
+ #include <sys/audioio.h>
+-#include <sys/ioctl.h>
+ #include <errno.h>
+ #include <fcntl.h>
++#include <string.h>
+ #include <unistd.h>
+-#include <alloca.h>
+ #include <audioframe.h>
+ #include "sun_sink.h"
+@@ -97,7 +98,7 @@ int SunSink::setAudioConfiguration(const
+ {
+     d->config = *config;
+-    AUDIO_INITINFO(&d->auinfo)
++    AUDIO_INITINFO(&d->auinfo);
+     if (ioctl(d->audio_fd, AUDIO_GETINFO, &d->auinfo) < 0)
+     {
diff --git a/audio/akode/patches/patch-ac b/audio/akode/patches/patch-ac
new file mode 100644 (file)
index 0000000..bdd9a3a
--- /dev/null
@@ -0,0 +1,133 @@
+$NetBSD$
+
+--- configure.orig     2007-04-06 16:23:22 +0300
++++ configure  2009-02-20 20:04:46 +0200
+@@ -913,6 +913,8 @@ VORBIS_LIBS
+ VORBISFILE_LIBS
+ include_xiph_decoder_TRUE
+ include_xiph_decoder_FALSE
++include_mpc_decoder_FALSE
++include_mpc_decoder_TRUE
+ include_src_resampler_TRUE
+ include_src_resampler_FALSE
+ include_alsa_sink_TRUE
+@@ -1559,6 +1561,7 @@ Optional Packages:
+   --with-pic              try to use only PIC/non-PIC objects [default=use
+                           both]
+   --with-tags[=TAGS]      include additional configurations [automatic]
++  --with-mpc              Enable MPC support [default=yes]
+   --with-flac             Enable FLAC support [default=check]
+   --with-speex            Enable speex support [default=check]
+   --with-libmad           Enable libmad support [default=check]
+@@ -23630,6 +23633,12 @@ ac_config_headers="$ac_config_headers ak
++# Check whether --with-mpc was given.
++if test "${with_mpc+set}" = set; then
++  withval=$with_mpc; with_mpc="$withval"
++else
++  with_mpc="yes"
++fi
+ # Check whether --with-flac was given.
+ if test "${with_flac+set}" = set; then
+@@ -23639,6 +23648,8 @@ else
+ fi
++have_libFLAC=no
++have_libOggFLAC=no
+ if test "x$flac_test" = "xyes" ; then
+@@ -24539,6 +24550,7 @@ else
+ fi
++have_libspeex=no
+ if test "x$speex_test" = "xyes" ; then
+ { echo "$as_me:$LINENO: checking for speex headers" >&5
+ echo $ECHO_N "checking for speex headers... $ECHO_C" >&6; }
+@@ -24554,8 +24566,8 @@ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h.  */
+-                #include <speex.h>
+-                #include <speex_callbacks.h>
++                #include <speex/speex.h>
++                #include <speex/speex_callbacks.h>
+                 #include <ogg/ogg.h>
+ int
+@@ -24733,10 +24745,10 @@ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h.  */
+-                #include <speex.h>
+-                #include <speex_callbacks.h>
+-                #include <speex_echo.h>
+-                #include <speex_preprocess.h>
++                #include <speex/speex.h>
++                #include <speex/speex_callbacks.h>
++                #include <speex/speex_echo.h>
++                #include <speex/speex_preprocess.h>
+                 #include <ogg/ogg.h>
+ int
+@@ -25506,12 +25518,12 @@ fi
+ if test "x$polypaudio_test" = "xyes" ; then
+-{ echo "$as_me:$LINENO: checking for Polypaudio 0.7 or later" >&5
+-echo $ECHO_N "checking for Polypaudio 0.7 or later... $ECHO_C" >&6; }
+-if $PKG_CONFIG --atleast-version 0.7 polyplib-simple >/dev/null 2>&1 ; then
+-  POLYP_CFLAGS="`$PKG_CONFIG --cflags polyplib-simple`"
+-  POLYP_LIBADD="`$PKG_CONFIG --libs-only-l polyplib-simple`"
+-  POLYP_LDFLAGS="`$PKG_CONFIG --libs-only-L polyplib-simple`"
++{ echo "$as_me:$LINENO: checking for Pulseaudio 0.9.2 or later" >&5
++echo $ECHO_N "checking for Pulseaudio 0.9.2 or later... $ECHO_C" >&6; }
++if $PKG_CONFIG --atleast-version 0.7 libpulse-simple >/dev/null 2>&1 ; then
++  POLYP_CFLAGS="`$PKG_CONFIG --cflags libpulse-simple`"
++  POLYP_LIBADD="`$PKG_CONFIG --libs-only-l libpulse-simple`"
++  POLYP_LDFLAGS="`$PKG_CONFIG --libs-only-L libpulse-simple`"
+   have_polyp=yes
+   { echo "$as_me:$LINENO: result: yes" >&5
+ echo "${ECHO_T}yes" >&6; }
+@@ -28341,6 +28353,13 @@ if test x$have_libFLAC$have_libOggFLAC$h
+ fi
++if test x$with_mpc = xyes; then
++  include_mpc_decoder_TRUE=
++  include_mpc_decoder_FALSE='#'
++else
++  include_mpc_decoder_TRUE='#'
++  include_mpc_decoder_FALSE=
++fi
+ if test x$usefull_xiph_decoder = xyes; then
+   include_xiph_decoder_TRUE=
+@@ -28660,6 +28679,13 @@ echo "$as_me: error: conditional \"inclu
+ Usually this means the macro was only invoked conditionally." >&2;}
+    { (exit 1); exit 1; }; }
+ fi
++if test -z "${include_mpc_decoder_TRUE}" && test -z "${include_mpc_decoder_FALSE}"; then
++  { { $as_echo "$as_me:$LINENO: error: conditional \"include_mpc_decoder\" was never defined.
++Usually this means the macro was only invoked conditionally." >&5
++$as_echo "$as_me: error: conditional \"include_mpc_decoder\" was never defined.
++Usually this means the macro was only invoked conditionally." >&2;}
++   { (exit 1); exit 1; }; }
++fi
+ if test -z "${include_xiph_decoder_TRUE}" && test -z "${include_xiph_decoder_FALSE}"; then
+   { { echo "$as_me:$LINENO: error: conditional \"include_xiph_decoder\" was never defined.
+ Usually this means the macro was only invoked conditionally." >&5
+@@ -30094,7 +30120,7 @@ if test "x$have_libOggFLAC" = "xno"; the
+         echo ">"
+ fi
+-if test "x$have_libSPEEX" = "xno"; then
++if test "x$have_libspeex" = "xno"; then
+         echo ">"
+         echo "> You do not seem to have libspeex installed."
+         echo "> Without it aKode and aRts will not be"
diff --git a/audio/akode/patches/patch-ad b/audio/akode/patches/patch-ad
new file mode 100644 (file)
index 0000000..4ddc7f0
--- /dev/null
@@ -0,0 +1,28 @@
+$NetBSD$
+
+--- akode/plugins/ffmpeg_decoder/ffmpeg_decoder.cpp.orig       2006-08-10 21:37:20 +0300
++++ akode/plugins/ffmpeg_decoder/ffmpeg_decoder.cpp    2009-02-20 13:57:54 +0200
+@@ -26,9 +26,11 @@
+ #include "decoder.h"
+ #include <assert.h>
+-#include <ffmpeg/avcodec.h>
+-#include <ffmpeg/avformat.h>
+-#include <ffmpeg/avio.h>
++extern "C" {
++#include <libavcodec/avcodec.h>
++#include <libavformat/avformat.h>
++#include <libavformat/avio.h>
++}
+ #include "ffmpeg_decoder.h"
+ #include <iostream>
+@@ -349,7 +351,7 @@ retry:
+             assert(false);
+     }
+     if (length == 0) return readFrame(frame);
+-    std::cout << "akode: FFMPEG: Frame length: " << length << "\n";
++    // std::cout << "akode: FFMPEG: Frame length: " << length << "\n";
+     if( d->packetSize <= 0 )
+         av_free_packet( &d->packet );
diff --git a/audio/akode/patches/patch-ae b/audio/akode/patches/patch-ae
new file mode 100644 (file)
index 0000000..487b8bf
--- /dev/null
@@ -0,0 +1,13 @@
+$NetBSD$
+
+--- akode/plugins/Makefile.in.orig     2009-02-20 10:13:15 +0200
++++ akode/plugins/Makefile.in  2009-02-20 10:13:53 +0200
+@@ -248,7 +248,7 @@ target_os = @target_os@
+ target_vendor = @target_vendor@
+ unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@
+ unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@
+-AKODE_MPC_DECODER = mpc_decoder
++@include_mpc_decoder_TRUE@AKODE_MPC_DECODER = mpc_decoder
+ @include_xiph_decoder_TRUE@AKODE_XIPH_DECODER = xiph_decoder
+ @include_mpeg_decoder_TRUE@AKODE_MPEG_DECODER = mpeg_decoder
+ @include_ffmpeg_decoder_TRUE@AKODE_FFMPEG_DECODER = ffmpeg_decoder
diff --git a/audio/akode/patches/patch-af b/audio/akode/patches/patch-af
new file mode 100644 (file)
index 0000000..85cb651
--- /dev/null
@@ -0,0 +1,19 @@
+$NetBSD$
+
+--- akode/plugins/xiph_decoder/speex_decoder.cpp.orig  2009-02-20 13:47:29 +0200
++++ akode/plugins/xiph_decoder/speex_decoder.cpp       2009-02-20 13:47:52 +0200
+@@ -25,10 +25,10 @@
+ extern "C" {
+ #include <string.h>
+ #include <stdlib.h>
+-#include <speex.h>
+-#include <speex_header.h>
+-#include <speex_callbacks.h>
+-#include <speex_stereo.h>
++#include <speex/speex.h>
++#include <speex/speex_header.h>
++#include <speex/speex_callbacks.h>
++#include <speex/speex_stereo.h>
+ #include <ogg/ogg.h>
+ }
diff --git a/audio/akode/patches/patch-ag b/audio/akode/patches/patch-ag
new file mode 100644 (file)
index 0000000..639e760
--- /dev/null
@@ -0,0 +1,40 @@
+$NetBSD$
+
+* Attempt fallback to ffmpeg decoder if loading the "native" one fails.
+* Reset resampler/converter if it isn't necessary any more.
+
+--- akode/lib/player.cpp.orig  2009-02-20 15:04:49 +0200
++++ akode/lib/player.cpp       2009-02-20 15:11:55 +0200
+@@ -345,8 +345,11 @@ bool Player::load() {
+             d->src = 0;
+             return false;
+         }
+-        if (!d->decoder_handler.load(format))
++        if (!d->decoder_handler.load(format)) {
+             AKODE_DEBUG("Could not load " << format << "-decoder");
++            if (!d->decoder_handler.load("ffmpeg"))
++                AKODE_DEBUG("Could not load ffmpeg-decoder");
++        }
+     }
+     if (!d->decoder_handler.isLoaded()) {
+@@ -398,6 +401,9 @@ bool Player::load() {
+         if (d->sample_rate != first_frame.sample_rate) {
+             AKODE_DEBUG("Resampling to " << d->sample_rate);
+             d->resampler->setSampleRate(d->sample_rate);
++        } else {
++            delete d->resampler;
++            d->resampler = 0;
+         }
+         int out_channels = d->sink->audioConfiguration()->channels;
+         int in_channels = first_frame.channels;
+@@ -419,6 +425,9 @@ bool Player::load() {
+                 d->converter = new Converter(out_width);
+             else
+                 d->converter->setSampleWidth(out_width);
++        } else {
++            delete d->converter;
++            d->converter = 0;
+         }
+     }
+     else
diff --git a/audio/akode/patches/patch-ah b/audio/akode/patches/patch-ah
new file mode 100644 (file)
index 0000000..97e947f
--- /dev/null
@@ -0,0 +1,29 @@
+$NetBSD$
+
+--- akode/plugins/jack_sink/jack_sink.cpp.orig 2009-02-20 15:39:03 +0200
++++ akode/plugins/jack_sink/jack_sink.cpp      2009-02-20 19:56:17 +0200
+@@ -84,7 +84,7 @@ static int process (jack_nframes_t nfram
+         m_data->pos++;
+     }
+-    return n;
++    return 0;
+ }
+ static void shutdown (void *arg)
+@@ -147,13 +147,13 @@ int JACKSink::setAudioConfiguration(cons
+     if (config->channel_config != MonoStereo ) return -1;
+     m_data->left_port = jack_port_register (m_data->client, "left", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+-    if (jack_connect (m_data->client, jack_port_name (m_data->left_port), "alsa_pcm:playback_1")) {
++    if (jack_connect (m_data->client, jack_port_name (m_data->left_port), "system:playback_1")) {
+         m_data->error = true;
+         return -1;
+     }
+     if (config->channels > 1) {
+         m_data->right_port = jack_port_register (m_data->client, "right", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+-        if (jack_connect (m_data->client, jack_port_name (m_data->right_port), "alsa_pcm:playback_2")) {
++        if (jack_connect (m_data->client, jack_port_name (m_data->right_port), "system:playback_2")) {
+             m_data->config.channels = 1;
+             res = 1;
+         }
diff --git a/audio/akode/patches/patch-ai b/audio/akode/patches/patch-ai
new file mode 100644 (file)
index 0000000..4786ba1
--- /dev/null
@@ -0,0 +1,22 @@
+$NetBSD$
+
+--- akode/plugins/polyp_sink/polyp_sink.cpp.orig       2009-02-20 19:59:19 +0200
++++ akode/plugins/polyp_sink/polyp_sink.cpp    2009-02-20 20:00:57 +0200
+@@ -25,7 +25,7 @@
+ #elif defined(HAVE_INTTYPES_H)
+ #include <inttypes.h>
+ #endif
+-#include <polyp/polyplib-simple.h>
++#include <pulse/simple.h>
+ #include "audioframe.h"
+ #include "audiobuffer.h"
+@@ -59,7 +59,7 @@ PolypSink::PolypSink()
+ bool PolypSink::open() {
+     int error = 0;
+-    m_data->server = pa_simple_new(0, "akode-client", PA_STREAM_PLAYBACK, 0, "", &m_data->sample_spec, 0, 255, &error );
++    m_data->server = pa_simple_new(0, "akode-client", PA_STREAM_PLAYBACK, 0, "", &m_data->sample_spec, 0, 0, &error );
+     if (!m_data->server || error != 0) {
+         m_data->error = true;
+         close();