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

zyzx的小窩

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

 

簡(jiǎn)單mp3播放器:音頻播放核心

tag:C,mp3解碼,libMAD,PortAudio

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

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

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

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

??????? 如下源碼參照 PortAudio庫(kù)中示例patest_read_write_wire.c 和 LibMad庫(kù)中示例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庫(kù)內(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庫(kù)是只接受一個(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 閱讀(1930) 評(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>
            久久精品综合| 欧美亚洲一区二区在线观看| 久久天天狠狠| 久久精品亚洲国产奇米99| 黄色日韩在线| 亚洲日本中文字幕免费在线不卡| 欧美成人一区二区三区在线观看| 亚洲人精品午夜在线观看| 欧美激情久久久| 亚洲天堂网在线观看| 午夜精品一区二区三区在线| 久久精品视频在线免费观看| 亚洲精品一区二区三区不| 亚洲欧美日韩中文播放| 欧美国产欧美综合| 亚洲一区二区三区成人在线视频精品 | 免费视频一区| 一区二区三区四区精品| 国产啪精品视频| 宅男66日本亚洲欧美视频| 中文在线资源观看网站视频免费不卡| 久久精品免视看| 亚洲国产精品成人| 久久久久久免费| 欧美激情在线狂野欧美精品| 在线成人免费视频| 99视频精品在线| 亚洲高清不卡在线| 免费不卡亚洲欧美| 久久久久网址| 亚洲一区二区三区在线播放| 久久精品最新地址| 日韩午夜三级在线| 久久精品视频在线观看| 亚洲欧美日韩精品久久久久| 99国产麻豆精品| 最新日韩av| 久久国产精品久久久久久| 国产精品影视天天线| 欧美韩日视频| 激情av一区二区| 亚洲一区二区三| 国产午夜精品一区二区三区视频 | 欧美波霸影院| 国产精品日韩精品| 亚洲人妖在线| 亚洲乱亚洲高清| 久久久久成人精品| 久久九九有精品国产23| 国产精品久久久久久久久免费桃花| 欧美一区二区三区四区高清| 午夜亚洲福利在线老司机| 一个人看的www久久| 欧美丰满高潮xxxx喷水动漫| 免费视频一区二区三区在线观看| 欧美成人中文字幕在线| 美女露胸一区二区三区| 国产综合色产| 美女主播视频一区| 国产综合精品| 久久久99国产精品免费| 久久一综合视频| 国产一区二区三区四区hd| 久久综合五月| 欧美另类视频在线| 亚洲欧洲一级| 日韩视频在线观看| 欧美破处大片在线视频| 欧美激情一区二区三区蜜桃视频 | 免费国产一区二区| 久久先锋影音| 有坂深雪在线一区| 免费亚洲一区| 亚洲日本成人女熟在线观看| 在线综合+亚洲+欧美中文字幕| 午夜国产精品视频| 欧美影院久久久| 韩国精品在线观看| 狂野欧美激情性xxxx欧美| 欧美成人有码| 亚洲素人一区二区| 国产人成精品一区二区三| 久久成人羞羞网站| 欧美激情一区二区在线| 一本色道久久精品| 美女黄网久久| 99在线精品视频在线观看| 欧美亚洲自偷自偷| 在线精品国产欧美| 欧美日韩一卡二卡| 欧美在线国产| 亚洲激情婷婷| 欧美一区二区三区在线观看| 亚洲高清资源| 久久黄金**| 亚洲激情偷拍| 久久精品国产2020观看福利| 最新国产精品拍自在线播放| 国产精品h在线观看| 久久久久综合| 正在播放日韩| 欧美激情一区二区三区成人| 亚洲伊人一本大道中文字幕| 欧美日本国产一区| 亚洲欧美在线播放| 99re66热这里只有精品4| 久久精品国产视频| 在线视频免费在线观看一区二区| 欧美第一黄网免费网站| 亚洲欧美另类中文字幕| 日韩亚洲欧美高清| 欧美成人精品在线| 久久成人18免费网站| 99这里只有精品| 亚洲国产小视频在线观看| 国产日韩欧美自拍| 欧美日韩在线大尺度| 欧美~级网站不卡| 亚洲成色www久久网站| 香蕉成人啪国产精品视频综合网| 国产精品区一区二区三区| 免费中文日韩| 久久中文久久字幕| 久久精品国产一区二区电影| 免费永久网站黄欧美| 欧美专区第一页| 先锋影音国产一区| 亚洲欧美大片| 亚洲午夜av| 国产精品99久久久久久久女警| 国产精品高潮呻吟久久av无限 | 欧美成人免费播放| 欧美在线视频全部完| 亚洲欧美中文另类| 日韩午夜在线观看视频| 欧美色视频在线| 欧美成人在线网站| 免费成年人欧美视频| 久久久999精品视频| 久久久国产精品一区二区三区| 欧美第一黄色网| 玖玖精品视频| 欧美大片免费| 亚洲国产导航| 亚洲精品一区二区三区福利| 最新成人在线| 日韩视频免费观看高清在线视频 | 香蕉久久夜色精品国产使用方法| 国产亚洲欧洲| 国产欧美日韩一区| 国内精品久久久久久影视8 | 99re这里只有精品6| 久久精品国产69国产精品亚洲| 亚洲国产专区| 亚洲美女av电影| 亚洲视频成人| 欧美一级夜夜爽| 久久夜色精品国产噜噜av| 这里只有精品丝袜| 午夜一级久久| 看片网站欧美日韩| 欧美一区二区三区在线视频 | 欧美日韩高清在线播放| 先锋亚洲精品| 久久久久久久综合色一本| 亚洲天堂第二页| 欧美一级久久| 免费短视频成人日韩| 欧美日韩视频在线第一区| 国产精品一区二区黑丝| 在线播放不卡| 国产亚洲在线| 伊人久久综合| 亚洲一区二区黄色| 久久亚洲国产精品日日av夜夜| 亚洲欧美日韩国产成人| 久久久九九九九| 日韩视频在线一区二区三区| 欧美一区二区视频在线| 欧美黄色视屏| 国产一区二区视频在线观看| 亚洲精品一区二区三区樱花| 亚洲欧美一区二区三区久久| 欧美成人精品高清在线播放| 麻豆精品在线播放| 一本大道av伊人久久综合| 久久婷婷丁香| 国产日韩欧美在线播放| 一片黄亚洲嫩模| 欧美aa国产视频| 亚洲一区二区三区色| 免费美女久久99| 国产婷婷成人久久av免费高清| 国产伦精品一区二区三区| 亚洲人成网站在线观看播放| 欧美在线视频在线播放完整版免费观看| 亚洲欧美国产va在线影院| 免费人成精品欧美精品| 欧美www视频在线观看| 亚洲免费在线视频|