青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

zyzx的小窩

C/C++,GUI,個(gè)人移動(dòng)存儲(chǔ),zyzx_lsl@163.com

 

簡單mp3播放器:音頻播放核心

tag:C,mp3解碼,libMAD,PortAudio

/* Create by zyzx
* Created 2008-08-09
* Modified 2008-08-09
*/

一、準(zhǔn)備
?????? 1、依賴庫PortAudio(http://www.portaudio.com/
???????????? Win32平臺(tái)編譯見《Win32環(huán)境PortAudio庫編譯簡介:音頻播放

?????? 2、依賴庫libMAD (http://www.underbit.com/products/mad/)
???????????? 簡介:開源跨平臺(tái)的mpeg-1,mpeg-2,mpeg-2.5,MP3解碼C庫。
???????????? 編譯環(huán)境 Win32 + VS
???????????? 下載libMAD 打開 ..\msvc++\LibMad.sln 可以用VS直接編譯。

二、編碼試驗(yàn)
??????? 如上一篇《簡單音頻播放:音頻播放核心實(shí)現(xiàn)》的代碼實(shí)現(xiàn),不同的是LibMad 提供給我們的解碼方式稍微有些區(qū)別。

??????? 如下源碼參照 PortAudio庫中示例patest_read_write_wire.c 和 LibMad庫中示例minimad.c文件進(jìn)行的修改,還有Audacity中的部分實(shí)現(xiàn)。。所以還有很多地方懶得去理會(huì),代碼難看點(diǎn)。。

??????? 需要注意的地方:
??????? 基本上同上一篇。
??????? 1)PCM格式,分左右聲道2個(gè)緩存區(qū)域
??????? 2)PortAudio接受一個(gè)緩存區(qū)域,左右聲道并列方式組織。

??????? 3)當(dāng)然如果要讓你的音頻播放模塊能夠支持更多種格式,可要做一番設(shè)計(jì)了。。要做到可以替換編解碼模塊,驅(qū)動(dòng)聲卡模塊,跨平臺(tái),移植ARM那些系統(tǒng),還是不容易的。。


如下是全部的源碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "portaudio.h"

#include <sys/types.h>

#include "mad.h"

#include "windows.h"

/* #define SAMPLE_RATE (17932) // Test failure to open with this value. */
#define SAMPLE_RATE (44100)
#define FRAMES_PER_BUFFER ( 64 * 1024 )
#define NUM_CHANNELS??? (2)
/* #define DITHER_FLAG???? (paDitherOff) */
#define DITHER_FLAG???? (0) /**/

/* Select sample format. */
#if 1
#define PA_SAMPLE_TYPE paFloat32
#define SAMPLE_SIZE (4)
#define SAMPLE_SILENCE (0.0f)
#define CLEAR(a) bzero( (a), FRAMES_PER_BUFFER * NUM_CHANNELS * SAMPLE_SIZE )
#define PRINTF_S_FORMAT "%.8f"
#elif 0
#define PA_SAMPLE_TYPE paInt16
#define SAMPLE_SIZE (2)
#define SAMPLE_SILENCE (0)
#define CLEAR(a) bzero( (a), FRAMES_PER_BUFFER * NUM_CHANNELS * SAMPLE_SIZE )
#define PRINTF_S_FORMAT "%d"
#elif 0
#define PA_SAMPLE_TYPE paInt24
#define SAMPLE_SIZE (3)
#define SAMPLE_SILENCE (0)
#define CLEAR(a) bzero( (a), FRAMES_PER_BUFFER * NUM_CHANNELS * SAMPLE_SIZE )
#define PRINTF_S_FORMAT "%d"
#elif 0
#define PA_SAMPLE_TYPE paInt8
#define SAMPLE_SIZE (1)
#define SAMPLE_SILENCE (0)
#define CLEAR(a) bzero( (a), FRAMES_PER_BUFFER * NUM_CHANNELS * SAMPLE_SIZE )
#define PRINTF_S_FORMAT "%d"
#else
#define PA_SAMPLE_TYPE paFloat32//paUInt8
#define SAMPLE_SIZE ( sizeof(float) )
#define SAMPLE_SILENCE (128)
#define CLEAR( a ) { \
??? int i; \
??? for( i=0; i<FRAMES_PER_BUFFER*NUM_CHANNELS; i++ ) \
??? ((unsigned char *)a)[i] = (SAMPLE_SILENCE); \
}
#define PRINTF_S_FORMAT "%d"
#endif

#define WIN32_AUDIO_BUFF_LEN??? 32 * 1024 * 1024

#define WIN32_BUFF_MAD_LEN??? ??? FRAMES_PER_BUFFER

typedef struct
{
??? float*??? ??? buffer;?????????????????????????????? //* - 解碼后的數(shù)據(jù)存儲(chǔ)區(qū)域
??? long??? ??? current, bufferlen ;

??? unsigned char*??? bufferMad;?????????? //* - 由于LibMad是一段一段讀寫,這里是緩沖區(qū)域
??? long??? bfMadLen;

??? unsigned int samplerate;??? ??? /* sampling frequency (Hz) */
??? unsigned short channels;??? ??? /* number of channels */

??? FILE* file;

} Win32_Data ;

struct MadBuffer {
??? unsigned char const *start;
??? unsigned long length;
};

static
enum mad_flow input(void *data,
struct mad_stream *stream)
{
??? Win32_Data *buffer = (Win32_Data*)data;

??? //if (!buffer->length)
??? //??? return MAD_FLOW_STOP;

??? //mad_stream_buffer(stream, buffer->start, buffer->length);

??? //buffer->length = 0;

??? if( feof( buffer->file ) ) {
??? ??? return MAD_FLOW_STOP;
??? }

??? //* - 這段摘自Audacity(http://audacity.sourceforge.net/)
??? //* - 由于mp3編碼方式,可能某次讀取的數(shù)據(jù)并不是完整的,我們只取完整的 frame段,
??? //* - 將剩余的部分留給下段。

??? unsigned int unconsumedBytes;
??? if(stream->next_frame) {
??? ??? unconsumedBytes = buffer->bufferMad + WIN32_BUFF_MAD_LEN - stream->next_frame;
??? ??? memmove(buffer->bufferMad, stream->next_frame, unconsumedBytes);
??? }
??? else
??? ??? unconsumedBytes = 0;

??? off_t read = fread(buffer->bufferMad + unconsumedBytes, sizeof( unsigned char ), WIN32_BUFF_MAD_LEN - unconsumedBytes, buffer->file);

??? mad_stream_buffer(stream, buffer->bufferMad, read + unconsumedBytes);

??? return MAD_FLOW_CONTINUE;
}

/*
* The following utility routine performs simple rounding, clipping, and
* scaling of MAD's high-resolution samples down to 16 bits. It does not
* perform any dithering or noise shaping, which would be recommended to
* obtain any exceptional audio quality. It is therefore not recommended to
* use this routine if high-quality output is desired.
*/

static inline
float scale(mad_fixed_t sample)
{
??? /* round */
??? //sample += (1L << (MAD_F_FRACBITS - 16));

??? ///* clip */
??? //if (sample >= MAD_F_ONE)
??? //??? sample = MAD_F_ONE - 1;
??? //else if (sample < -MAD_F_ONE)
??? //??? sample = -MAD_F_ONE;

??? ///* quantize */
??? //return sample >> (MAD_F_FRACBITS + 1 - 16);

??? //* 將libMad庫內(nèi)置的采樣點(diǎn)格式轉(zhuǎn)換為 32位float類型
??? return (float) (sample / (float) (1L << MAD_F_FRACBITS));
}

/*
* This is the output callback function. It is called after each frame of
* MPEG audio data has been completely decoded. The purpose of this callback
* is to output (or play) the decoded PCM audio.
*/

static
enum mad_flow output(void *data,
struct mad_header const *header,
struct mad_pcm *pcm)
{
??? unsigned int nsamples;
??? mad_fixed_t const *left_ch, *right_ch;
??? Win32_Data* buffer = ( Win32_Data* ) data;

??? ///* pcm->samplerate contains the sampling frequency */

??? buffer->channels = pcm->channels;
??? buffer->samplerate = pcm->samplerate;
??? nsamples = pcm->length;
??? left_ch?? = pcm->samples[0];
??? right_ch = pcm->samples[1];

??? while (nsamples--) {
??? ??? float sample;

??? ??? /* output sample(s) in 16-bit signed little-endian PCM */
??????? //* - PCM格式 的數(shù)據(jù)是分布在2個(gè)緩存區(qū)域中分左右聲道,而PortAudio庫是只接受一個(gè)區(qū)域
??????? //* - 左右聲道數(shù)據(jù)相鄰,所以轉(zhuǎn)換下。
??? ??? if ( buffer->channels == 2) {
??? ??? ??? sample = scale(*left_ch++);
??? ??? ??? buffer->buffer[ buffer->current++ ] = sample;
??? ??? ??? sample = scale(*right_ch++);
??? ??? ??? buffer->buffer[ buffer->current++ ] = sample;
??? ??? }
??? }

??? return MAD_FLOW_CONTINUE;
}

/*
* This is the error callback function. It is called whenever a decoding
* error occurs. The error is indicated by stream->error; the list of
* possible MAD_ERROR_* errors can be found in the mad.h (or stream.h)
* header file.
*/

static
enum mad_flow error(void *data,
struct mad_stream *stream,
struct mad_frame *frame)
{
??? //struct buffer *buffer = data;

??? //fprintf(stderr, "decoding error 0x%04x (%s) at byte offset %u\n",
??? //??? stream->error, mad_stream_errorstr(stream),
??? //??? stream->this_frame - buffer->start);

??? ///* return MAD_FLOW_BREAK here to stop decoding (and propagate an error) */

??? return MAD_FLOW_CONTINUE;
}

/*
* This is the function called by main() above to perform all the decoding.
* It instantiates a decoder object and configures it with the input,
* output, and error callback functions above. A single call to
* mad_decoder_run() continues until a callback function returns
* MAD_FLOW_STOP (to stop decoding) or MAD_FLOW_BREAK (to stop decoding and
* signal an error).
*/

static
int decode( Win32_Data * data )
{
??? //struct buffer buffer;
??? struct mad_decoder decoder;
??? int result;

??? ///* initialize our private message structure */

??? //buffer.start = start;
??? //buffer.length = length;

??? ///* configure input, output, and error functions */

??? mad_decoder_init(&decoder, data,
??? ??? ??? ??? ??? input, 0 /* header */, 0 /* filter */, output,
??? ??? ??? ??? ??? error, 0 /* message */);

??? ///* start decoding */

??? //* - 此函數(shù)是同步函數(shù),在“input”函數(shù)返回MAD_FLOW_STOP后才完成。
??? //* - 出錯(cuò)在error函數(shù)中定義行為。
??? result = mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC);

??? ///* release the decoder */

??? mad_decoder_finish(&decoder);

??? return result;
}

/*******************************************************************/
int main(int argc, char *argv [] );
int main(int argc, char *argv [] )
{

??? Win32_Data audio_data;

??? audio_data.buffer = new float[ WIN32_AUDIO_BUFF_LEN ] ;
??? audio_data.bufferMad = new unsigned char[ WIN32_BUFF_MAD_LEN ];
??? audio_data.current = 0;

??? PaStreamParameters inputParameters, outputParameters;
??? PaStream *stream = NULL;
??? PaError err;
??? char *sampleBlock;
??? int i;
??? int numBytes;


??? printf("patest_read_write_wire.c\n"); fflush(stdout);

??? //numBytes = FRAMES_PER_BUFFER * NUM_CHANNELS * SAMPLE_SIZE ;
??? //sampleBlock = (char *) malloc( numBytes );
??? //if( sampleBlock == NULL )
??? //{
??? //??? printf("Could not allocate record array.\n");
??? //??? exit(1);
??? //}

??? audio_data.file = fopen ( argv[1] , "rb" );

??? if (audio_data.file == NULL)
??? {
??? ??? fputs ("File error",stderr);
??? ??? exit (1);
??? }

??? printf( "-- Start Decode %s\n" , argv[1] );

??? decode( &audio_data );
??? audio_data.bufferlen = audio_data.current;
??? audio_data.current = 0;

??? fclose( audio_data.file );
??? printf( "-- End Decode\n" );

??? printf( "-------------------------------\n" );

??? printf( "Output samplerate %d\n", audio_data.samplerate );
??? printf( "Output channels %d\n", audio_data.channels );

??? err = Pa_Initialize();
??? if( err != paNoError ) goto error;

??? //printf( "-------------------------------\n" );

??? //printf( "Output samplerate %d\n", audio_data.sfinfo.samplerate );
??? //printf( "Output frames %d\n", audio_data.sfinfo.frames );
??? //printf( "Output channels %d\n", audio_data.sfinfo.channels );
??? //printf( "seekable %d\n ", audio_data.sfinfo.seekable );
??? //printf( "format is %d\n ", audio_data.sfinfo.format );
??? //printf( "Sections is %d\n ", audio_data.sfinfo.sections );

??? //printf( "Read buffer len %d\n" , audio_data.bufferlen );

??? //printf( "-------------------------------\n" );

??? //inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */
??? //printf( "Input device # %d.\n", inputParameters.device );
??? //printf( "Input LL: %g s\n", Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency );
??? //printf( "Input HL: %g s\n", Pa_GetDeviceInfo( inputParameters.device )->defaultHighInputLatency );
??? //inputParameters.channelCount = audio_data.sfinfo.channels;//NUM_CHANNELS;
??? //inputParameters.sampleFormat = PA_SAMPLE_TYPE;
??? //inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultHighInputLatency ;
??? //inputParameters.hostApiSpecificStreamInfo = NULL;

??? outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
??? printf( "Output device # %d.\n", outputParameters.device );
??? printf( "Output LL: %g s\n", Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency );
??? printf( "Output HL: %g s\n", Pa_GetDeviceInfo( outputParameters.device )->defaultHighOutputLatency );
??? outputParameters.channelCount = audio_data.channels;//NUM_CHANNELS;
??? outputParameters.sampleFormat = PA_SAMPLE_TYPE;
??? outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultHighOutputLatency;
??? outputParameters.hostApiSpecificStreamInfo = NULL;

??? /* -- setup -- */

??? err = Pa_OpenStream(
??? ??? &stream,
??? ??? NULL,//&inputParameters,
??? ??? &outputParameters,
??? ??? SAMPLE_RATE,
??? ??? FRAMES_PER_BUFFER,
??? ??? paClipOff,????? /* we won't output out of range samples so don't bother clipping them */
??? ??? NULL, /* no callback, use blocking API */
??? ??? NULL ); /* no callback, so no callback userData */
??? if( err != paNoError ) goto error;

??? //err = Pa_StartStream( stream );
??? //if( err != paNoError ) goto error;
??? //printf("Wire on. Will run one minute.\n"); fflush(stdout);

??? //for( i=0; i<(60*SAMPLE_RATE)/FRAMES_PER_BUFFER; ++i )
??? //{
??? //??? err = Pa_WriteStream( stream, sampleBlock, FRAMES_PER_BUFFER );
??? //??? if( err ) goto xrun;
??? //??? err = Pa_ReadStream( stream, sampleBlock, FRAMES_PER_BUFFER );
??? //??? if( err ) goto xrun;
??? //}
??? //err = Pa_StopStream( stream );
??? //if( err != paNoError ) goto error;

??? //CLEAR( sampleBlock );

??? err = Pa_StartStream( stream );
??? if( err != paNoError ) goto error;
??? printf("Wire on. Interrupt to stop.\n"); fflush(stdout);

??? while( 1 )
??? {

??? ??? err = Pa_WriteStream( stream, audio_data.buffer + audio_data.current/*sampleBlock*/, FRAMES_PER_BUFFER );
??? ??? audio_data.current = audio_data.current + FRAMES_PER_BUFFER * NUM_CHANNELS /* SAMPLE_SIZE */;

??? ??? //if( audio_data.current + FRAMES_PER_BUFFER * NUM_CHANNELS * SAMPLE_SIZE > audio_data.bufferlen ) break;

??? ??? printf( "%d\n", audio_data.current);

??? ??? if( err ) goto xrun;
??? ??? //err = Pa_ReadStream( stream, sampleBlock, FRAMES_PER_BUFFER );
??? ??? //if( err ) goto xrun;
??? }
??? err = Pa_StopStream( stream );
??? if( err != paNoError ) goto error;

??? Pa_CloseStream( stream );

??? free( sampleBlock );

??? Pa_Terminate();
??? return 0;

xrun:
??? if( stream ) {
??? ??? Pa_AbortStream( stream );
??? ??? Pa_CloseStream( stream );
??? }
??? free( sampleBlock );
??? Pa_Terminate();
??? if( err & paInputOverflow )
??? ??? fprintf( stderr, "Input Overflow.\n" );
??? if( err & paOutputUnderflow )
??? ??? fprintf( stderr, "Output Underflow.\n" );

??? delete [] audio_data.buffer;
??? delete [] audio_data.bufferMad;
??? return -2;

error:
??? if( stream ) {
??? ??? Pa_AbortStream( stream );
??? ??? Pa_CloseStream( stream );
??? }
??? free( sampleBlock );
??? Pa_Terminate();
??? fprintf( stderr, "An error occured while using the portaudio stream\n" );
??? fprintf( stderr, "Error number: %d\n", err );
??? fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );

??? delete [] audio_data.buffer;
??? delete [] audio_data.bufferMad;
??? return -1;
}

三、某此播放mp3文件 截圖 -- 留念

TestMadMp3.png

posted on 2009-04-27 17:19 zyzx 閱讀(1940) 評(píng)論(0)  編輯 收藏 引用 所屬分類: OpenSource開源

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

常用鏈接

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩一区二区精品| 亚洲第一区在线观看| 免费成人黄色| 久久亚洲综合色一区二区三区| 久久久精品久久久久| 巨乳诱惑日韩免费av| 欧美日韩午夜视频在线观看| 亚洲美女免费精品视频在线观看| 一区二区日韩免费看| 欧美在线观看一二区| 欧美成人午夜激情视频| 99亚洲一区二区| 久久精品人人爽| 亚洲精美视频| 欧美一区二区高清在线观看| 亚洲欧美日韩精品久久久久| 欧美成人四级电影| 国产精品丝袜久久久久久app| 伊人一区二区三区久久精品| 一区二区三区四区五区视频| 亚洲一区二区三区四区中文| 在线综合视频| 欧美成人有码| 亚洲午夜电影网| 亚洲国产婷婷| 久久精品国产亚洲aⅴ| 国产精品va在线播放| 亚洲福利国产| 麻豆精品精华液| 亚洲视频www| 一区二区三区自拍| 久久久91精品| 欧美一区二区| 国产一区免费视频| 性色av一区二区三区红粉影视| 亚洲另类自拍| 欧美成人tv| 久久激情久久| 久久久欧美精品| 在线日韩成人| 亚洲国产精品成人综合色在线婷婷 | 欧美日韩中文字幕综合视频| 亚洲精品社区| 亚洲精品日韩精品| 狠狠色伊人亚洲综合成人| 欧美中文日韩| 久久九九全国免费精品观看| 国产精品99久久99久久久二8 | 亚洲欧美日本在线| 中文精品视频| 亚洲另类春色国产| 久久艳片www.17c.com| 性欧美超级视频| 国产精品久久久久久久久免费桃花 | 亚洲国产成人久久| 欧美综合77777色婷婷| 在线看片一区| 久久激情视频| 欧美综合国产| 国产欧美日韩综合一区在线观看 | 亚洲美女电影在线| 狂野欧美性猛交xxxx巴西| 久久久精彩视频| 国产日本欧美视频| 亚洲女人av| 亚洲缚视频在线观看| 久久精品人人做人人爽| 久久精品女人天堂| 国产一区二区三区精品久久久| 美女性感视频久久久| 欧美二区在线播放| 亚洲在线视频网站| 久久精品国产91精品亚洲| 午夜欧美电影在线观看| 欧美a一区二区| 午夜视频一区在线观看| 国产精品美女久久久久av超清| 一区二区三区导航| 亚洲国产一区在线观看| 久久这里只有精品视频首页| 免费观看久久久4p| 亚洲美女黄色| 欧美午夜精品久久久久免费视| 中文久久精品| 久久人人97超碰人人澡爱香蕉| 欧美日韩精品三区| 欧美**人妖| 国产婷婷色一区二区三区| 日韩一级黄色av| 亚洲欧洲精品一区二区三区波多野1战4| 9i看片成人免费高清| 午夜精品久久久久久久99水蜜桃| 国产精品专区h在线观看| 亚洲精品一区中文| 亚洲欧美自拍偷拍| 136国产福利精品导航网址| 蜜乳av另类精品一区二区| 亚洲精品一区二区在线| 亚洲免费婷婷| 亚洲国产成人久久综合一区| 欧美日韩的一区二区| 欧美一区二区三区免费视| 久久色在线观看| 在线亚洲+欧美+日本专区| 国产精品一区二区在线观看网站| 久久资源在线| 亚洲天堂av在线免费| 夜夜嗨av一区二区三区网站四季av| 久久久久久久久岛国免费| 亚洲区一区二区三区| 国产欧美亚洲一区| 欧美高清视频www夜色资源网| 亚洲永久精品国产| 亚洲国产日韩在线| 久久久久久久激情视频| 99视频精品在线| 在线观看成人一级片| 国产精品久久久久久久久动漫| 99av国产精品欲麻豆| 久久人人超碰| 亚洲欧美资源在线| 一区二区三区波多野结衣在线观看| 国产亚洲欧美日韩精品| 国产精品a久久久久久| 久久综合伊人77777麻豆| 欧美一区视频| 亚洲永久免费观看| 亚洲深夜福利| 99国产精品自拍| 亚洲国产老妈| 欧美xxx成人| 鲁大师成人一区二区三区| 欧美影院视频| 欧美一区午夜精品| 午夜在线一区| 翔田千里一区二区| 亚洲综合色丁香婷婷六月图片| 99在线热播精品免费99热| 亚洲激情图片小说视频| 亚洲国产精品成人精品| 狠狠88综合久久久久综合网| 国产网站欧美日韩免费精品在线观看 | 欧美日韩亚洲在线| 欧美人妖另类| 亚洲中字黄色| 亚洲一区二区三区激情| 亚洲精品视频在线观看免费| 亚洲人成毛片在线播放| 亚洲国产成人久久综合一区| 亚洲国产精品久久久久秋霞不卡| 欧美aaa级| 欧美国产第一页| 91久久一区二区| 久久久久久久高潮| 另类春色校园亚洲| 狂野欧美激情性xxxx欧美| 欧美a级片网站| 亚洲福利视频三区| 亚洲精品亚洲人成人网| 一区二区电影免费观看| 亚洲女人天堂av| 久久久久久久尹人综合网亚洲| 久久亚洲综合网| 欧美激情综合亚洲一二区| 久久精品人人| 欧美激情1区2区3区| 欧美另类在线播放| 国产精品丝袜白浆摸在线| 国产综合香蕉五月婷在线| 亚洲第一级黄色片| 夜夜嗨一区二区三区| 亚洲欧美日韩一区二区在线 | 亚洲毛片av| 午夜精品一区二区在线观看| 久久久午夜视频| 亚洲精品日韩综合观看成人91| 一卡二卡3卡四卡高清精品视频| 亚洲免费网站| 欧美大胆成人| 国产模特精品视频久久久久| 一区视频在线播放| 亚洲网站在线看| 久久永久免费| 久久婷婷综合激情| 91久久夜色精品国产网站| 亚洲欧美一区二区三区极速播放| 久久综合九色| 国产精品乱码| 亚洲毛片视频| 久久婷婷人人澡人人喊人人爽| 亚洲日本中文字幕免费在线不卡| 亚洲欧美在线免费观看| 美女精品自拍一二三四| 国产精品一区二区女厕厕| 亚洲片区在线| 久久伊人亚洲| 午夜精品亚洲一区二区三区嫩草| 亚洲性视频网站| 欧美激情精品久久久久久| 国产亚洲福利社区一区|