- Timestamp:
- Mar 9, 2009 12:55:29 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/branches/projects/aps-direct/pjmedia/src/pjmedia-audiodev/wmme_dev.c
r2489 r2492 48 48 #define THIS_FILE "wmme_dev.c" 49 49 50 51 50 /* WMME device info */ 52 51 struct wmme_dev_info … … 81 80 DWORD dwBufIdx; 82 81 DWORD dwMaxBufIdx; 83 unsigned latency_ms;84 82 pj_timestamp timestamp; 85 83 }; … … 89 87 struct wmme_stream 90 88 { 91 pjmedia_aud_stream base; 92 pjmedia_dir dir; /**< Sound direction. */ 93 int play_id; /**< Playback dev id. */ 94 int rec_id; /**< Recording dev id. */ 89 pjmedia_aud_stream base; /**< Base stream */ 90 pjmedia_aud_param param; /**< Settings */ 95 91 pj_pool_t *pool; /**< Memory pool. */ 96 92 … … 105 101 pjmedia_format_id fmt_id; /**< Frame format */ 106 102 pj_uint8_t silence_char; /**< Silence pattern */ 107 unsigned clock_rate; /**< Clock rate. */108 103 unsigned bytes_per_frame; /**< Bytes per frame */ 109 unsigned samples_per_frame; /**< Samples per frame. */110 unsigned bits_per_sample; /**< Bits per sample. */111 unsigned channel_count; /**< Channel count. */112 104 113 105 pjmedia_frame_ext *xfrm; /**< Extended frame buffer */ … … 438 430 param->samples_per_frame = di->info.default_samples_per_sec * 20 / 1000; 439 431 param->bits_per_sample = 16; 440 param->flags = di->info.caps; 432 param->flags = PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY | 433 PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY; 441 434 param->input_latency_ms = PJMEDIA_SND_DEFAULT_REC_LATENCY; 442 435 param->output_latency_ms = PJMEDIA_SND_DEFAULT_PLAY_LATENCY; … … 498 491 499 492 if (id == PJMEDIA_FORMAT_L16) 500 return " l16";493 return "PCM"; 501 494 pj_memcpy(name, &id, 4); 502 495 name[4] = '\0'; … … 686 679 eventCount = 0; 687 680 events[eventCount++] = strm->thread_quit_event; 688 if (strm-> dir & PJMEDIA_DIR_PLAYBACK)681 if (strm->param.dir & PJMEDIA_DIR_PLAYBACK) 689 682 events[eventCount++] = strm->play_strm.hEvent; 690 if (strm-> dir & PJMEDIA_DIR_CAPTURE)683 if (strm->param.dir & PJMEDIA_DIR_CAPTURE) 691 684 events[eventCount++] = strm->rec_strm.hEvent; 692 685 … … 696 689 */ 697 690 #if defined(PJ_WIN32_WINCE) && PJ_WIN32_WINCE != 0 698 if (strm-> dir & PJMEDIA_DIR_PLAYBACK)691 if (strm->param.dir & PJMEDIA_DIR_PLAYBACK) 699 692 CeSetThreadPriority(GetCurrentThread(), 153); 700 693 else … … 834 827 if (++wmme_strm->dwBufIdx >= wmme_strm->dwMaxBufIdx) 835 828 wmme_strm->dwBufIdx = 0; 836 wmme_strm->timestamp.u64 += strm-> samples_per_frame /837 strm-> channel_count;829 wmme_strm->timestamp.u64 += strm->param.samples_per_frame / 830 strm->param.channel_count; 838 831 } 839 832 } … … 914 907 strm->xfrm->samples_cnt = 0; 915 908 strm->xfrm->subframe_cnt = 0; 916 pjmedia_frame_ext_append_subframe(strm->xfrm, buffer, 917 strm->bytes_per_frame *8, 918 strm->samples_per_frame); 909 pjmedia_frame_ext_append_subframe( 910 strm->xfrm, buffer, 911 strm->bytes_per_frame *8, 912 strm->param.samples_per_frame 913 ); 919 914 } 920 915 … … 938 933 if (++wmme_strm->dwBufIdx >= wmme_strm->dwMaxBufIdx) 939 934 wmme_strm->dwBufIdx = 0; 940 wmme_strm->timestamp.u64 += strm-> samples_per_frame /941 strm-> channel_count;935 wmme_strm->timestamp.u64 += strm->param.samples_per_frame / 936 strm->param.channel_count; 942 937 } 943 938 } … … 982 977 983 978 strm = PJ_POOL_ZALLOC_T(pool, struct wmme_stream); 984 strm->dir = param->dir; 985 strm->play_id = param->play_id; 986 strm->rec_id = param->rec_id; 979 pj_memcpy(&strm->param, param, sizeof(*param)); 987 980 strm->pool = pool; 988 981 strm->rec_cb = rec_cb; … … 991 984 strm->fmt_id = param->ext_fmt.id; 992 985 strm->silence_char = silence_char; 993 strm->clock_rate = param->clock_rate;994 strm->samples_per_frame = param->samples_per_frame;995 strm->bits_per_sample = param->bits_per_sample;996 strm->channel_count = param->channel_count;997 986 998 987 /* Create player stream */ … … 1000 989 unsigned buf_count; 1001 990 1002 if ( param->flags & PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY)1003 strm->p lay_strm.latency_ms = param->output_latency_ms;1004 else1005 strm->play_strm.latency_ms = PJMEDIA_SND_DEFAULT_PLAY_LATENCY;1006 1007 buf_count = strm->p lay_strm.latency_ms * param->clock_rate *991 if ((param->flags & PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY)==0) { 992 strm->param.flags |= PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY; 993 strm->param.output_latency_ms = PJMEDIA_SND_DEFAULT_PLAY_LATENCY; 994 } 995 996 buf_count = strm->param.output_latency_ms * param->clock_rate * 1008 997 param->channel_count / param->samples_per_frame / 1000; 1009 998 … … 1024 1013 unsigned buf_count; 1025 1014 1026 if ( param->flags & PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY)1027 strm-> rec_strm.latency_ms = param->input_latency_ms;1028 else1029 strm->rec_strm.latency_ms = PJMEDIA_SND_DEFAULT_REC_LATENCY;1030 1031 buf_count = strm-> rec_strm.latency_ms * param->clock_rate *1015 if ((param->flags & PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY)==0) { 1016 strm->param.flags |= PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY; 1017 strm->param.input_latency_ms = PJMEDIA_SND_DEFAULT_REC_LATENCY; 1018 } 1019 1020 buf_count = strm->param.input_latency_ms * param->clock_rate * 1032 1021 param->channel_count / param->samples_per_frame / 1000; 1033 1022 … … 1075 1064 } 1076 1065 1066 /* Apply the remaining settings */ 1067 if (param->flags & PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING) { 1068 stream_set_cap(&strm->base, PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING, 1069 ¶m->output_vol); 1070 } 1071 1072 1077 1073 /* Done */ 1078 1074 strm->base.op = &stream_op; … … 1090 1086 PJ_ASSERT_RETURN(strm && pi, PJ_EINVAL); 1091 1087 1092 pj_bzero(pi, sizeof(*pi)); 1093 pi->dir = strm->dir; 1094 pi->play_id = strm->play_id; 1095 pi->rec_id = strm->rec_id; 1096 pi->clock_rate = strm->clock_rate; 1097 pi->channel_count = strm->channel_count; 1098 pi->samples_per_frame = strm->samples_per_frame; 1099 pi->bits_per_sample = strm->bits_per_sample; 1088 pj_memcpy(pi, &strm->param, sizeof(*pi)); 1100 1089 1101 if (pi->dir & PJMEDIA_DIR_CAPTURE) {1102 pi->flags |= PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY;1103 pi->input_latency_ms = strm->rec_strm.latency_ms;1104 }1105 1106 if (pi->dir & PJMEDIA_DIR_PLAYBACK) {1107 /* TODO: report the actual latency? */1108 pi->flags |= PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY;1109 pi->output_latency_ms = strm->play_strm.latency_ms;1110 }1111 1112 1090 return PJ_SUCCESS; 1113 1091 } … … 1123 1101 1124 1102 if (cap==PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY && 1125 (strm-> dir & PJMEDIA_DIR_CAPTURE))1103 (strm->param.dir & PJMEDIA_DIR_CAPTURE)) 1126 1104 { 1127 1105 /* Recording latency */ 1128 *(unsigned*)pval = strm-> rec_strm.latency_ms;1106 *(unsigned*)pval = strm->param.input_latency_ms; 1129 1107 return PJ_SUCCESS; 1130 1108 } else if (cap==PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY && 1131 (strm-> dir & PJMEDIA_DIR_PLAYBACK))1109 (strm->param.dir & PJMEDIA_DIR_PLAYBACK)) 1132 1110 { 1133 1111 /* Playback latency */ 1134 *(unsigned*)pval = strm->p lay_strm.latency_ms;1112 *(unsigned*)pval = strm->param.output_latency_ms; 1135 1113 return PJ_SUCCESS; 1136 1114 } else if (cap==PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING && … … 1138 1116 { 1139 1117 /* Output volume setting */ 1140 DWORD dwVol;1118 DWORD waveVol; 1141 1119 MMRESULT mr; 1142 1120 1143 mr = waveOutGetVolume(strm->play_strm.hWave.Out, & dwVol);1121 mr = waveOutGetVolume(strm->play_strm.hWave.Out, &waveVol); 1144 1122 if (mr != MMSYSERR_NOERROR) { 1145 1123 return PJMEDIA_AUDIODEV_ERRNO_FROM_WMME_OUT(mr); 1146 1124 } 1147 1125 1148 dwVol &= 0xFFFF;1149 *(unsigned*)pval = ( dwVol * 100) / 0xFFFF;1126 waveVol &= 0xFFFF; 1127 *(unsigned*)pval = (waveVol * 100) / 0xFFFF; 1150 1128 return PJ_SUCCESS; 1151 1129 } else { … … 1167 1145 { 1168 1146 /* Output volume setting */ 1169 DWORD dwVol; 1147 unsigned vol = *(unsigned*)pval; 1148 DWORD waveVol; 1170 1149 MMRESULT mr; 1171 1172 dwVol = ((*(unsigned*)pval) * 0xFFFF) / 100; 1173 dwVol |= (dwVol << 16); 1174 1175 mr = waveOutSetVolume(strm->play_strm.hWave.Out, dwVol); 1176 return (mr==MMSYSERR_NOERROR)? PJ_SUCCESS : 1150 pj_status_t status; 1151 1152 if (vol > 100) 1153 vol = 100; 1154 1155 waveVol = (vol * 0xFFFF) / 100; 1156 waveVol |= (waveVol << 16); 1157 1158 mr = waveOutSetVolume(strm->play_strm.hWave.Out, waveVol); 1159 status = (mr==MMSYSERR_NOERROR)? PJ_SUCCESS : 1177 1160 PJMEDIA_AUDIODEV_ERRNO_FROM_WMME_OUT(mr); 1161 if (status == PJ_SUCCESS) { 1162 strm->param.output_vol = *(unsigned*)pval; 1163 } 1164 return status; 1178 1165 } 1179 1166
Note: See TracChangeset
for help on using the changeset viewer.